2009-01-31 5 views
9

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

<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] 

Спасибо!

+0

Добро пожаловать к переполнению стека. Спасибо, что четко сформулировали ваш вопрос, предоставили код и показали, что работает, а что нет. Если у вас есть полезная информация в ваших журналах apache, сообщите об этом тоже. Иногда проблемы с перенаправлением становятся более очевидными, когда вы видите журналы. –

+0

К сожалению, у меня нет доступа к этой информации. – oxeleo

ответ

14

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

RewriteCond %{ENV:REDIRECT_STATUS} 200 
RewriteRule .* - [L] 
+0

Бинго! Работали как очарование, и нет необходимости в переменной окружения. – oxeleo

1

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

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

О, и первый аргумент RewriteCond directive не является регулярным выражением, а просто строкой. Таким образом, избежать ошибки ..

+0

Спасибо, это сработало для меня :) –

0

Есть ли причина, по которой вы не можете использовать символ окончания конца строки, $?

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

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

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

0

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

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/