web-dev-qa-db-fra.com

L'URL sans fin de barre oblique fait qu'Apache recherche dans DocumentRoot non SSL

J'ai configuré un hôte virtuel dans Apache pour la fourniture de contenu via SSL/TLS. Étant donné que je souhaite également autoriser d'autres sites de mon domaine à utiliser le protocole http standard, j'ai deux racines de document, une en /home/www/html et une en /home/www/html-ssl. J'impose SSL sur mon site avec les directives suivantes dans un fichier dans /etc/httpd/conf.d:

<Directory /home/www/html-ssl/foo>
    SSLOptions +StrictRequire
    SSLRequireSSL
    SSLRequire ( %{HTTP_Host} eq "mydomain.com" )
    ErrorDocument 403 https://mydomain.com/foo
</Directory>

Ceci redirige toutes les demandes de http://mydomain.com/foo/ vers https://mydomain.com/foo/. Cependant, lorsque j'essaie d'accéder à http://mydomain.com/foo sans la barre oblique finale, Apache recherche foo dans /home/www/html au lieu de /home/www/html-ssl, ce qui provoque un 404. Y a-t-il un moyen de dire Apache que http://mydomain.com/foo devrait vraiment chercher le répertoire foo dans /home/www/html-ssl, puis être redirigé vers le site https? Je pensais que puisque DirectorySlash est activé, Apache pourrait comprendre que foo est un répertoire. À ce stade, il verrait ma section <Directory> ci-dessus et fonctionnerait comme par magie.

2
ThisSuitIsBlackNot

Une solution alternative consisterait à appliquer la barre oblique de fin à la fin de vos URL - cela aurait l'avantage d'empêcher les doublons si vous n'utilisiez pas Rel Canonical .

SOURCE

Cela redirigera toutes les demandes sans fin/vers l'URL avec la barre oblique à la fin. (Notez que dans la deuxième partie de l’accolade se trouvent les extensions de fichier à ignorer. Comme il n’a pas de sens d’appliquer/sur une URL d’image.

RewriteCond %{REQUEST_URI} !\.(php|html?|jpg|gif)$

RewriteRule ^(.*)([^/])$ http://%{HTTP_Host}/$1$2/ [L,R=301]

2
Simon Hayter

Répondre à ma propre question. Je ne sais pas si c'est la solution la meilleure, mais j'ai compris comment faire cela en utilisant une combinaison de mod_rewrite et de la section <Directory> que j'avais déjà. Fondamentalement, toutes les demandes arrivant sur des ports autres que 443 étaient dirigées vers mon hôte virtuel non SSL (duh). Apache mappait donc les URL aux fichiers de la racine du document non SSL (/home/www/html). Si je réécris toutes les requêtes non https pour foo en https avec mod_rewrite, les nouvelles requêtes utiliseront le port 443 et Apache pourra se résoudre dans le bon répertoire:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/foo [NC]
RewriteCond %{HTTP_Host} ^mydomain.com?
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

<Directory /home/www/html-ssl/foo>
    SSLOptions +StrictRequire
    SSLRequireSSL
    SSLRequire ( %{HTTP_Host} eq "mydomain.com" )
    ErrorDocument 403 https://mydomain.com/foo
</Directory>
0
ThisSuitIsBlackNot

Et encore une autre solution plus simple. Au lieu d'utiliser mod_rewrite, créez simplement un alias mappant /foo vers le bon répertoire:

Alias /foo /home/www/html-ssl/foo
<Directory /home/www/html-ssl/foo>
    SSLOptions +StrictRequire
    SSLRequireSSL
    SSLRequire ( %{HTTP_Host} eq "mydomain.com" )
    ErrorDocument 403 https://mydomain.com/foo
</Directory>
0
ThisSuitIsBlackNot