mod_rewrite не возьмет третье правило - PullRequest
0 голосов
/ 14 февраля 2012

У меня проблема с моим кодом mod_rewrite.Я хочу, чтобы перезапись происходила на основе 3 правил:

  1. Если это не известный файл (images, xml), перенаправьте файл index.php (для Zend MVC)
  2. Еслиперед доменным именем нет www, добавьте его
  3. . Если запрошенный URL-адрес www.domain.com/page/pagename, перепишите на www.domain.com/page/show/id/pagename

Пока у меня работают первые два, но третий не работает.Это мой код:

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php [QSA,L]

RewriteCond %{HTTP_HOST} ^fietsnl.nl
RewriteRule (.*) http://www.fietsnl.nl [R=301,L]

RewriteCond %{REQUEST_URI} ^page/([a-zA-Z_]+)$
RewriteRule ^page/([a-zA-Z_]+)$ /page/show/id/$1 [L] 

Если я запрашиваю http://www.domain.com/page/pagename,, он по-прежнему переопределяется на первое правило. Можете ли вы указать мне правильное направление для изменения?

Спасибо!

Ответы [ 2 ]

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

L in

RewriteRule (.*) index.php [QSA,L]

Указывает mod_rewrite прекратить обработку правил, поэтому два приведенных ниже никогда не будут обработаны в случае, если файл не существует на сервере.

Я не мастер в mod_rewrite, но перемещая последнее правило перед первым правилом, оно должно решить вашу проблему.

RewriteEngine on

RewriteCond %{REQUEST_URI} ^page/([a-zA-Z_]+)$
RewriteRule ^page/([a-zA-Z_]+)$ /page/show/id/$1 [L] 

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule (.*) index.php [QSA,L]

RewriteCond %{HTTP_HOST} ^fietsnl.nl
RewriteRule (.*) http://www.fietsnl.nl [R=301,L]
0 голосов
/ 14 февраля 2012

Правила сопоставляются в том порядке, в котором они появляются.

Я предполагаю, что page/pagename не является существующим файлом или каталогом, поэтому он будет соответствовать первому правилу, и никакие другие правила не будут обработаны мной.

Как правило, вы хотите, чтобы правила были упорядочены от наиболее специфических к наименее конкретным, а переадресация обычно выполнялась перед перезаписью.

Простым решением было бы перенести первое правило в конец.

...