这个mod_rewrite有什么问题?

时间:2011-05-18 02:09:01

标签: .htaccess mod-rewrite ignore

RewriteCond %{HTTP_HOST} ^(www.)?domain.com$
RewriteCond %{REQUEST_URI} !^/errors/$
RewriteCond %{REQUEST_URI} !^/content/$
RewriteRule ^(.*)$ /domain/$1/ [L]

第一行和最后一行工作,它们确保来自该域的所有内容都转到该子目录。中间的两个我试图避免重定向。我需要从子目录中访问这两个文件夹,但HTTP_HOST只是将其发送回同一文件夹(错误404)。

如果它正在寻找domain.com/content/(.*)domain.com/content/(.*),我希望它忽略该规则。请注意,我无法访问服务器配置,而.htaccess是我能够做到这一点的唯一方法。

感谢。

2 个答案:

答案 0 :(得分:3)

我建议压缩你的.htaccess代码:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/*(domain|errors|content)/ [NC]
RewriteRule . /domain%{REQUEST_URI}/ [L]
  • .需要转发为\.
  • [NC]用于忽略大小写比较
  • errorscontent的否定URI匹配可以在单个规则中与OR |
  • 合并
  • %{REQUEST_URI}已经拥有原始URI,因此无需捕获
  • 在否定匹配中添加domain以避免无限循环

答案 1 :(得分:2)

条件中的正则表达式仅匹配/errors/ 完全的请求,因为您已包含字符串开头和字符串结尾锚点{{1} }和^):

$

由于您希望条件与开始的所有请求匹配RewriteCond %{REQUEST_URI} !^/errors/$ ,因此您应该在最后删除/errors/

$

同样明显适用于RewriteCond %{REQUEST_URI} !^/errors/ 条件。