Préface
Premièrement: Une simple réécriture du port 80 -> du port 443 NE résoudra PAS ce problème. Dans presque toutes les questions précédentes, le fil de discussion, le fil de forum, etc., j'ai trouvé que c'était la première réponse ignorante et a été répétée plusieurs fois.
Deuxièmement: Oui, je sais que vous ne pouvez pas servir le trafic HTTP et HTTPS sur le même port. Ce n'est pas ça.
Scénario:
Serveur Apache hébergeant plusieurs sites via la multiplication de ports. Le port 80 dessert un site public. Le port 443 sert la version sécurisée de ce site.
Les ports 7443, 8443 et 9443 desservent chacun des sites distincts sécurisés par SSL.
Si un utilisateur tape l'URL ou reçoit un lien non valide, dites http: //hostname.tld: 7443 , la page ridicule suivante leur est donnée:
Au lieu du serveur, il suffit de les rediriger vers https: //hostname.tld: 7443 .
Ma question est, comment au nom du trou du cul de Zeus pouvez-vous modifier le comportement d'Apache ou ce message d'erreur pour rediriger automatiquement l'utilisateur?
Apache sert manifestement une demande non https (pour afficher ce message d'erreur) même s'il est configuré pour HTTPS. Il me semble remarquablement stupide de ne pas simplement faire la redirection par défaut, mais je peux comprendre pourquoi ils ont adopté le comportement qu'ils ont fait, même si je ne suis pas d'accord. Donc ma question est: pouvez-vous le changer? Ils gèrent l'erreur QUELQUE PART, et avec Apache étant la corne d'abondance de configuration qu'elle est, il va de soi qu'il existe une directive quelque part pour gérer ce comportement, mais je n'ai pas été en mesure de la trouver en plusieurs heures de bricolage jusqu'à présent.
Mise à jour:
J'ai tenté diverses choses, notamment:
en utilisant des
ErrorDocument 400
directives pour accéder à un CGI et à un script PHP qui envoient simplement des enStatus 301
-Location
têtes. Il en résulte une page vierge. En utilisantErrorDocument 400 https://hostname.tld:7443
simplement, ce lien s'affiche sur la page.L'utilisation de presque toutes les combinaisons de
mod_rewrite
I ou de Google peut arriver, y compris des déclarations générales qui dirigent entièrement le site; ceux-ci ne fonctionnent jamais . Littéralement, ils ne font rien. Je suppose qu'Apache est en train de commettre l'erreur ci-dessus avant même d'essayer de traiter les directives de réécriture.
Je ne peux pas utiliser de redirections basées sur le port, en raison de l'utilisation du port personnalisé. Je ne peux pas utiliser de redirections basées sur des scripts car elles ne sont jamais servies en raison de la non-correspondance http / https. Je suis presque prêt à attribuer cela à un bug ou à un comportement involontaire, mais quelqu'un a pensé à y insérer un message d'erreur très personnalisé, il n'a pas pris la peine de penser que vous voudriez peut-être simplement URL qu'ils fournissent déjà ?
la source
Réponses:
Je pense que c'est probablement un bug dans la façon dont Apache 2.2 et inférieur gère cette circonstance particulière.
Il semble qu'en cas d'
400 Bad Request
erreur de lecture SSL , Apache 2.2 ne renvoie pas le code de réponse HTTP ou les en-têtes, uniquement le corps de la réponse HTTP. Je teste en téléphonant au port 443 et en envoyant:Le serveur renvoie immédiatement (pour moi):
Notez l'absence de code de réponse HTTP ou d'en-têtes HTTP.
Lorsque je fais cela sur un serveur Apache 2.4, j'obtiens:
Si je configure une ligne ErrorDocument comme vous l'avez fait:
Ensuite, j'obtiens le code HTML pour une redirection 302, mais encore une fois, aucun des en-têtes. Sans le code de réponse de redirection 302 et l'en-
Location:
tête, le navigateur ne redirigera pas.Essayez la mise à niveau vers Apache 2.4 et voyez si cela fonctionne. J'ai testé et confirmé avec au moins Apache 2.4.3, mais je n'ai pas fait l'effort de trouver exactement quand ce comportement a été mis à jour. Je soupçonne que dans la grande quantité de travail qu'ils ont fait en préparant 2.4, ils ont corrigé le comportement indésirable comme un effet secondaire.
Bogues Apache httpd pertinents:
MISE À JOUR
Vous pouvez forcer un bogue Apache à vous donner le comportement que vous souhaitez (la redirection) en demandant au script d'imprimer ses en-têtes (qui ne seront pas envoyés au client), puis de réimprimer manuellement les en-têtes que vous souhaitez. Voici un script Perl de base qui fonctionne sous Apache 2.2.22:
Vous devez savoir qu'il existe d'autres raisons pour lesquelles un 400 peut être généré en plus de simplement parler à un port SSL sans SSL. Le moyen le plus simple de le déterminer est de rechercher la
HTTPS
variable d'environnement. S'il est défini, SSL a été négocié correctement et quelque chose d'autre provoque le 400 (ne faites pas l'astuce de double en-tête si c'est le cas). SiHTTPS
n'est pas défini, renvoyez votre redirection comme ci-dessus.la source
<javascript
balise et avoir de la chance avec la redirection de piratage de cette façon, mais jusqu'à présent, non dé. Rien à ce sujet ne semble être géré d'une manière qui suit la génialité par ailleurs assez rigide d'Apache ...Vous pouvez résoudre ce problème avec mod-rewrite. Définissez une règle qui correspond à tout. Voir cette réponse sur Stackoverflow
la source
sites-available
répertoire. Même si vous le redirigez simplement vers un non-sens, ou le redirigez vers un site différent, un port différent, etc., il ne fait que charger cette 400 mauvaise demande.