Je loue un serveur Web Apache. L’architecture de dossier est comme ceci:
- racine
- src
- modèle
- Moins
- www
- css
- js
- jpeg
Le serveur Web ne sert que le répertoire www
. Et j’utilise un .htaccess pour redirect vers HTTPS, supprimez le www.
et redirect toutes les requêtes vers index.php
sauf si un fichier existe dans le dossier www
.
RewriteEngine On # Redirect to HTTPS RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # Remove WWW RewriteCond %{HTTP_HOST} ^www\.domaine\.com$ [NC] RewriteRule (.*) https://domaine.com%{REQUEST_URI} [R=301,QSA,NC,L] # Redirect all route to index.php # Except the files RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) /index.php?$1/ [NC,L,QSA]
Le problème est le moment où je demande un nom de dossier. Le dossier est redirigé deux fois vers index.php
!
Exemple: Lorsque je demande http://domaine.com/css
, la demande est redirigée vers https://domaine.com/index.php?css/?css/
.
Comment résoudre la double redirection?
Vous devez soit exclure des répertoires de votre dernière règle, soit append une barre oblique à l’aide d’une règle de redirection aux répertoires pour éviter ce comportement.
Sinon, la dernière règle réécrit les répertoires sans barre oblique dans /index.php
et, à cause de la barre oblique mod_dir
module mod_dir
redirige en ajoutant une barre oblique mod_dir
.
Aussi, vous devez déplacer la règle www
avant la règle http->https
pour éviter plusieurs redirections 301 pour une requête qui est http://www.domaine.com/
.
Options -MultiViews Options -Indexes RewriteEngine On # Remove WWW and use https RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,NE,L] # Redirect to HTTPS RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] # add trailing slash for directories RewriteCond %{REQUEST_FILENAME} -d RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301] # Redirect all route to index.php # Except the files RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php?$0/ [NC,L,QSA]
Veillez à vider le cache de votre navigateur avant de tester cette modification.
Je résous mon problème. Je supprime la barre oblique automatique à la fin avec la directive DirectorySlash. Maintenant, cela fonctionne et tous mes répertoires sont cachés. Seul le fichier est visible.
Options -MultiViews Options -Indexes DirectorySlash Off RewriteEngine On # Remove WWW and use https RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=301,NE,L] # Redirect to HTTPS RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* /index.php?$0 [NC,L,QSA]