mod_rewrite规则仅匹配确切的URL

时间:2011-06-10 14:34:42

标签: .htaccess mod-rewrite

我遇到mod_rewrite的问题,我希望匹配并替换特定的网址。我想重写的网址是:

http://example.com/rsshttp://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

但是这会将rssrss与其他任何内容相匹配。如何重新编写上述代码才能 http://example.com/rss作为mod_rewrite匹配的模式?

2 个答案:

答案 0 :(得分:2)

您收到此错误是因为RewriteRules在规则中将/rss重定向两次。你有这样的规则:

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]

因此,根据上述规则,它会将/rssrss/个URI重定向到/rss.php,但/rss/foo将被重定向到/index.php,因为您的第二个规则是转发<强>一切到/index.php

答案 1 :(得分:0)

我很惊讶地看到你的规则不起作用,因为在我的第一次尝试中我会得到一个非常相似的解决方案。但是看重写日志就会发现真正的问题。

如描述here,服务器更喜欢目录上的真实文件。因此,在应用重写规则时,内部rss/something变为rss.php/something,事情变得奇怪。

因此,一种解决方案是检查.htaccess或vhost配置中是否为Web目录启用了选项MultiViews。如果是这样,请将其删除 - 在本例中,这对我有用。

如果您需要MultiViews,那么我想唯一的机会是将rss.php重命名为rss-content.php并相应地更改规则。

另外需要注意:您可能希望在# ... CMS块之后添加以下行,以防止无休止的递归调用。

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

我希望这能解决你的重写问题。

相关问题