htaccess调用所有内容的重写规则

时间:2010-09-27 09:47:01

标签: apache .htaccess mod-rewrite

这是我的htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Static pages
RewriteRule ^print/([0-9]+)$ index.php?action=PublicDisplayPrint&page_id=$1 [L,QSA]
RewriteRule ^email/([0-9]+)$ index.php?action=PublicDisplayEmail&page_id=$1 [L,QSA]
RewriteRule ^login$ index.php?action=PublicDisplayLogin [L,QSA]
RewriteRule ^search$ index.php?action=PublicDisplaySearch [L,QSA]
RewriteRule ^feedback$ index.php?action=PublicDisplayFeedback [L,QSA]
RewriteRule ^sitemap$ index.php?action=PublicDisplaySitemap [L,QSA]

# Dynamic pages
RewriteRule ^(.*)$ index.php?action=PublicDisplayPage&url=$1 [L,QSA]

它似乎在任何文件上调用动态页面规则(例如logo.gif),因此它似乎没有运行第2行和第3行。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

RewriteCond directive的条件仅属于第一个RewriteRule directive。因此,在这种情况下,两个RewriteCond条件仅适用于第一个RewriteRule而不适用于其他规则,尤其不适用于最后一个规则。

所以将RewriteCond指令放在最后RewriteRule指令的前面:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?action=PublicDisplayPage&url=$1 [L,QSA]

答案 1 :(得分:1)

RewriteCond仅适用于下一个RewriteRule,因此您的最后7条规则将适用于任何请求。

您可以为每个规则重复条件,将其放在最后一条规则上,也可以使用明确的规则按原样提供内容(这样更灵活,因为您可以在以后添加更多动态规则):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
#If it's a file or directory, serve as is, without rewriting
RewriteRule ^ - [L] 

#Rest of the rules