Цикл очистки URL-адресов - PullRequest
       7

Цикл очистки URL-адресов

9 голосов
/ 31 января 2009

Я пытаюсь создать чистые URL на моем сайте. Теперь мне удалось настроить apache, поэтому каждый запрос, такой как mysite.com / page , будет работать. Но я также хочу, чтобы запросы на mysite.com / page.php были перенаправлены на mysite.com / page . Я установил переменную окружения в .htaccess, чтобы проверить, перенаправлен ли я уже для предотвращения циклов, но я все еще получаю их ... Вот .htaccess:

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On
RewriteBase /

# set the variable
RewriteRule ^$ - [L]
RewriteRule ^(.*)$ $1 [E=REWROTE:0]

# this works fine
# make mysite.com/page work and set REWROTE variable to 1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1]

# but if i enable this, i get redirected and then stuck in a loop
# redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1
#RewriteCond %{ENV:REWROTE} !^1$
#RewriteRule ^(.*)\.php$ $1 [R=301,L]

Спасибо!

Ответы [ 4 ]

14 голосов
/ 31 января 2009

Добавьте это правило поверх существующих правил перезаписи, чтобы прекратить перенаправление, если запрос уже был перенаправлен один раз ( ref ):

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
1 голос
/ 31 января 2009

Вы можете проверить строку запроса на предмет того, что изначально запрашивалось:

RewriteCond %{THE_REQUEST} ^[A-Z]+\ (/[^\ ]*)\.php[?\ ]
RewriteRule \.php$ %1 [R=301,L]

О, и первый аргумент директивы RewriteCond - это не регулярное выражение, а просто строка. Так что бегство от . - это неправильно.

0 голосов
/ 02 февраля 2013

Еще один быстрый и грязный способ предотвратить зацикливание в этих ситуациях, которые я обнаружил, - добавить строку запроса, а затем проверить ее существование в перенаправлении.

RewriteCond %{QUERY_STRING} !a=a
RewriteRule ^(.*)\.php$ %1 [NC,R=301,L]
RewriteRule ^(.*)$ $1.php?a=a [NC,L]

найдено на этом сайте: http://answers.oreilly.com/topic/542-how-to-properly-redirect-for-maximum-seo/

0 голосов
/ 29 сентября 2009

Существует ли какая-то причина, по которой вы не можете использовать символ завершения строки, $?

RewriteRule ^/(.+)\.php$ /$1

перенаправит /page.php на / страницу, но не будет перенаправлять на / страницу.

По сути, использование методов, таких как установка переменных среды и добавление проверок для REDIRECT_STATUS, не будет очень надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...