2015-01-10 1 views
1

У меня проблема, когда я пытаюсь перенаправить и переписать вместе. У меня есть сайт example.com/show_table.php?table=12 (не более 99 таблиц). Я хотел хорошие ссылки, так что я получил этот .htacces правило Rw:mod_rewrite и перенаправление вызывающей петли

RewriteRule ^table/([0-9]{1,2})$ show_table.php?table=$1 [L,NC]

Теперь ссылки что-то вроде example.com/table/12 - это, безусловно, OK. Но я хочу, чтобы все старые ссылки перенаправлялись в новый формат. Поэтому я использую Перенаправление 301, я добавил в .htaccess следующий код:

RewriteCond %{REQUEST_URI} show_table.php RewriteCond %{QUERY_STRING} ^table=([0-9]{1,2})$ RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC]

Но когда я посещаю example.com/show_table.php?table=12, я получаю только REDIR петлю. Я не понимаю: первое - переписывание, второе - перенаправление, нет двух перенаправлений. Вы видите какую-либо ошибку?

Спасибо!

ответ

1

Вместо проверки REQUEST_URI в условии, что вам нужно проверять в THE_REQUEST (который содержит полный оригинальный запрос HTTP, как GET /show_table.php HTTP/1.1). Когда Apache выполняет переписывание, он меняет REQUEST_URI, поэтому на перезаписанное значение и отправляет вас в цикл.

# Match show_table.php in the input request 
RewriteCond %{THE_REQUEST} /show_table\.php 
RewriteCond %{QUERY_STRING} ^table=([0-9]{1,2})$ 
# Do a full redirection to the new URL 
RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC] 

# Then apply the internal rewrite as you already have working 
RewriteRule ^table/([0-9]{1,2})$ show_table.php?table=$1 [L,NC] 

Вы могли бы получить более конкретные условия %{THE_REQUEST}, но оно должно быть достаточным и не вреден для использования show_table\.php как выражение.

Вы должны прочитать записи по THE_REQUEST по телефону at Apache's RewriteCond documentation.

Примечание: Технически вы можете зафиксировать строку запроса в том же RewriteCond и уменьшить ее до одного условия. Это немного короче:

# THE_REQUEST will include the query string so you can get it here. 
RewriteCond %{THE_REQUEST} /show_table\.php\?table=([0-9]{1,2}) 
RewriteRule ^show_table\.php$ http://example.com/table/%1? [L,R=301,NC] 
+1

Вам нужно бежать '\' в THE_REQUEST RewriteCond регулярок – Croises

+0

@Croises хорошо пятнистый, спасибо?. –

+0

Работает отлично. СПАСИБО! –

Смежные вопросы