Правило mod_rewrite соответствует только точному URL - PullRequest
0 голосов
/ 10 июня 2011

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

http://example.com/rss до http://example.com/rss.php

Это означает, что если кто-то добавит что-либо после rss, будет отправлен ответ 404 Not Found. В настоящее время я использую этот mod_rewrite фрагмент:

Options -Indexes

RewriteEngine on
RewriteBase /

# pick up request for RSS feed
RewriteRule ^rss/?$ rss.php [L,NC]

# pass any other request through CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+) index.php/$1

Но это соответствует rss и rss с чем-либо еще, добавленным в конец. Как я могу переписать вышеупомянутое в acces only http://example.com/rss как образец для mod_rewrite для сравнения?

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Вы получаете эту ошибку, потому что /rss дважды перенаправляется в ваших правилах обоими RewriteRules.Ваши правила должны быть такими:

Options +FollowSymlinks -MultiViews -Indexes
RewriteEngine On
RewriteBase /

# pick up request for RSS feed
RewriteRule ^rss/?$ /rss.php [L,NC]

# pass any other request through CMS
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (?!^rss\.php$)^(.*)$ /index.php/$1 [L,NC]

Таким образом, с указанными выше правилами он будет перенаправлять /rss ИЛИ rss/ URI на /rss.php, однако /rss/foo будет перенаправлен на /index.php, так как ваше второе правилопересылка всего на /index.php

0 голосов
/ 10 июня 2011

Я был удивлен, увидев, что ваши правила просто не работают, потому что в моей первой попытке я бы нашел очень похожее решение.Но просмотр журнала перезаписи выявил реальную проблему.

Как указано здесь , сервер предпочитает реальные файлы, а не каталоги.Таким образом, внутренне rss/something становится rss.php/something при применении правил перезаписи, и все становится странным.

Итак, одним из решений является проверка, включена ли опция MultiViews для веб-каталога в .htaccess или вконфигурация vhost.Если это так, удалите его - это то, что сработало для меня в этом примере.

Если вам нужно MultiViews, то, я думаю, единственный шанс - переименовать rss.php в rss-content.php и соответствующим образом изменить правило..

Еще одно примечание: вы можете добавить следующую строку после блока # ... CMS, чтобы предотвратить бесконечные рекурсивные вызовы.

RewriteRule ^index\.php/.* - [PT,L]

Надеюсь, это решит вашу проблему перезаписи.

...