Apache mod_rewrite дружественные URL с соответствующими 301 перенаправлениями - PullRequest
0 голосов
/ 21 февраля 2012

Проблема:

Я крутил мои колеса и некоторое время читал об этом, и теперь ищу помощи.Я собираюсь взять группу недружественных URL-адресов (на самом деле есть больше «групп», но это должен быть для примера):

  1. domainname.com /? Section = zebras
  2. domainname.com /? Section = monkeys & id = 555

и превратить их в удобные URL-адреса, а также сделать 301 на старых версиях, чтобы любые старые закладки (и поисковые системы)все равно разрешит их.Мне нужен новый формат:

  1. domainname.com / zebras /
  2. domainname.com / monkeys / 555

I 'Я полностью намереваюсь написать отдельные комбинации RewriteCond / RewriteRule для каждого из этих сценариев, поэтому мне не обязательно нужно супер-правило, которое перехватывает все мои сценарии.О, и это все в .htaccess.

My Progress:

Я изначально попадал в цикл перенаправления, потому что я просто делал два RewriteRule вплотную - одиндля дружественного URL и один для перенаправления 301.Наткнулся на мой любимый способ (пока что) по циклу перенаправления, который работает (по крайней мере, для моего сценария № 1):

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{QUERY_STRING} ^section=zebras$ [NC]
RewriteRule ^.*$ http://www.domainname.com/zebras/? [R=301,NC,L]

RewriteRule ^zebras/$ /index\.php?section=zebras [NC,L]

Однако я хотел бы иметь что-то, что работает больше, чем просто "зебры "(например, я хотел бы, чтобы это работало и для" львов "), поэтому я пытаюсь сделать это более общим.То, что я сейчас пытаюсь, выглядит так:

RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
RewriteRule ^section=([a-z]+)$ http://www.domainname.com/$1/? [R=301,NC,L]

RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]

Однако это не работает.Я думаю, что у меня есть что-то "не совсем правильное", я просто не могу сказать, что это такое - что-то я пропускаю или неправильно форматирую где-то.Заранее извините за длинное описание, просто хотел быть понятным.

1 Ответ

1 голос
/ 21 февраля 2012

Сделайте это:

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.\w+|/)$ 
RewriteRule (.*) /$1/ [R,L]

RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
RewriteRule ^ /%1/? [R=301,NC,L]

RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]

RewriteCond %{QUERY_STRING} ^section=([a-z]+)&id=(\d+)$ [NC]
RewriteRule ^ /%1/%2/? [R=302,NC,L]

RewriteRule ^([a-z]+)/(\d+)/$ /index\.php?section=$1&id=$2 [NC,L]

Описание

Предотвращает зацикливание:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

Предотвращает проблему косой черты:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.\w+|/)$ 
RewriteRule (.*) /$1/ [R,L]

Обрабатывает перезаписи только с section=([a-z]+) в них:

RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
RewriteRule ^ /%1/? [R=302,NC,L]

RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]

Обрабатывает перезаписи только с section=([a-z]+)&id=(\d+) в них:

RewriteCond %{QUERY_STRING} ^section=([a-z]+)&id=(\d+)$ [NC]
RewriteRule ^ /%1/%2/? [R=302,NC,L]

RewriteRule ^([a-z]+)/(\d+)/$ /index\.php?section=$1&id=$2 [NC,L]

ошибка в ваших правилах:

section=([a-z]+) недоступно в части URI.Итак, RewriteRule ^section=([a-z]+)$ никогда не совпало.

...