mod_rewrite正则表达式仅在某个字符串不存在时才匹配

时间:2009-02-05 04:51:59

标签: regex apache mod-rewrite

查看我的服务器日志,我发现我网站上的很多网页都在各种不同的目录中请求favicon.icofavicon.jpgfavicon.png等。

我正在编写一些apache重定向规则来更改对包含"favicon"的任何网址的请求以重定向到{{1},而不是浏览每个页面以尝试找出每个不正确的请求的来源。 }

我最初的天真尝试是:

/favicon.ico

但这意味着当您实际请求RewriteRule favicon /favicon.ico [R=301,L] 时,它会将您发送到无限重定向循环。

基本上我认为我需要的是具有这种效果的正则表达式:

/favicon.ico

4 个答案:

答案 0 :(得分:11)

我建议改变Alex's excellent answer的一些变化:

保持此部分相同:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]

在请求结束时检查不仅仅是.ico扩展名:

RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC]

添加抓取当前请求主机名的第三个条件:

RewriteCond %{HTTP_HOST} (.+)

最后更改最后一个RewriteRule以使用%1(a backreference representing the last matched condition):

RewriteRule (.*) http://%1/favicon.ico [R=301,L]

最终结果如下:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC]
RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC]
RewriteCond %{HTTP_HOST} (.+)
RewriteRule (.*) http://%1/favicon.ico [R=301,L]

希望这有助于某人...

答案 1 :(得分:6)

试试这个

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC] # if not already going to favicon.ico
RewriteCond %{REQUEST_URI} favicon\.ico [NC] # edit this line to match your favicon matching regex
RewriteRule (.*) http://www.domain.com.au/favicon.ico [R=301,L] #redirect to the real address

答案 2 :(得分:1)

脱离我的头顶:

RewriteRule favicon[.](\w*)$ /favicon.ico [L]

答案 3 :(得分:0)

我会使用这条规则:

RewriteCond %{REQUEST_URI} !^/favicon\.ico$
RewriteRule favicon /favicon.ico [L,R=301]