Использование htaccess для принудительного завершения косой черты перед?со строкой запроса? - PullRequest
3 голосов
/ 02 февраля 2012

В моем 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]

Это работает. Он скрывает index.php и добавляет косую черту ... кроме случаев, когда есть строка запроса.

Этот URL:

http://example.com/some-page

перенаправляется на:

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

но этот URL:

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

не перенаправляется. Я хотел бы, чтобы вышеперечисленное было отправлено по адресу:

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

Я достиг предела моего понимания перенаправлений с этим. Если у вас есть рабочий ответ, я был бы очень признателен за то, что делает каждая строка и почему она работает. Удивительный двойной бонус за объяснение того, почему то, что у меня есть сейчас, не работает, когда задействована строка запроса.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Попробуйте добавить [QSA] в конец последнего правила перенаправления, чтобы сохранить исходную строку запроса, как показано ниже

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

пошаговое описание того, что делает каждая строка и почему она работает.

Смотрите мои комментарии ниже

#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 string
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
1 голос
/ 03 февраля 2012

Я считаю, что если вы измените это:

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

к этому:

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

тогда он должен делать то, что вы хотите.

Изменения, которые я сделал:

  • В обоих условиях перезаписи и -rule я изменил (.*) и ^(.*) на ^([^?]*), чтобы гарантировать, что при наличии строки запроса она не будет включена ни в одно из регулярных выражений. ([^…] означает «любой символ, которого нет в », поэтому [^?] означает «любой символ, который не является вопросительным знаком».)
  • В условии перезаписи я изменил $ на ($|\?), чтобы соответствовать или end-of-URL или end-of-part-before- заместитель строки запроса.
  • В правиле перезаписи я отбросил $, так как он больше не нужен.
...