我遇到mod_rewrite
的问题,我希望匹配并替换特定的网址。我想重写的网址是:
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
与其他任何内容相匹配。如何重新编写上述代码才能仅 http://example.com/rss
作为mod_rewrite
匹配的模式?
答案 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]
因此,根据上述规则,它会将/rss
或rss/
个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]
我希望这能解决你的重写问题。