Conflit avec la redirection vers index.php et le dossier

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]