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.
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 .
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]
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>
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>