Utiliser htaccess pour forcer une barre oblique avant le? avec une chaîne de requête?

J’ai le suivant dans mon fichier htaccess:

RewriteEngine On RewriteBase / # Check to see if the URL points to a valid file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Trailing slash check RewriteCond %{REQUEST_URI} !(.*)/$ # Add slash if missing & redirect RewriteRule ^(.*)$ $1/ [L,R=301] # Check to see if the URL points to a valid file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Send to index.php for clean URLs RewriteRule ^(.*)$ index.php?/$1 [L] 

Cela fonctionne. Il cache index.php et ajoute une barre oblique finale … sauf s’il existe une chaîne de requête.

Cette URL:

 http://example.com/some-page 

est redirigé vers:

 http://example.com/some-page/ 

mais cette URL:

 http://example.com/some-page?some-var=foo&some-other-var=bar 

ne pas être redirigé. Je voudrais que ce qui précède soit envoyé à:

 http://example.com/some-page/?some-var=foo&some-other-var=bar 

J’ai atteint les limites de ma compréhension des redirections avec ceci. Si vous avez une réponse de travail, j’apprécierais vraiment une visite guidée de ce que chaque ligne fait et pourquoi cela fonctionne. Double bonus génial pour une explication de la raison pour laquelle ce que j’ai maintenant ne fonctionne pas quand une chaîne de requête est impliquée.

Essayez d’append un [QSA] à la fin de la dernière règle de redirection pour conserver la chaîne de requête d’origine comme ci-dessous

 # Send to index.php for clean URLs, preserve original query ssortingng RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 

un tour d’horizon de ce que chaque ligne fait et pourquoi cela fonctionne.

Voir mes commentaires ci-dessous

 #turn mod_rewrite engine on. RewriteEngine On #set the base for urls here to / RewriteBase / ### if the is not a request for an existing file or directory RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d ### and the URI does not end with a / RewriteCond %{REQUEST_URI} !(.*)/$ ### redirect and add the slash. RewriteRule ^(.*)$ $1/ [L,R=301] ### if the is not a request for an existing file or directory RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # rewrite to index.php passing the URI as a path, QSA will preserve the existing query ssortingng RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 

Je crois que si vous changez ceci:

 RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ $1/ [L,R=301] 

pour ça:

 RewriteCond %{REQUEST_URI} !^([^?]*)/($|\?) RewriteRule ^([^?]*) $1/ [L,R=301] 

alors il devrait faire ce que vous voulez.

Les modifications que j’ai apscopes sont:

  • A la fois dans rewrite-condition et dans -rule, j’ai changé (.*) Et ^(.*) ^([^?]*) , Pour s’assurer qu’il ya une chaîne de requête, alors elle n’est incluse dans aucune regex . ( [^…] signifie “tout caractère qui n’est pas dans “, donc [^?] Signifie “tout caractère qui n’est pas un point d’interrogation”.)
  • Dans la condition de réécriture, j’ai changé $ en ($|\?) , Afin de faire correspondre la fin de l’URL ou la fin de la partie avant la chaîne de requête.
  • Dans la règle de réécriture, j’ai supprimé le $ , car il n’était plus nécessaire.