【发布时间】:2010-03-09 10:04:10
【问题描述】:
如何将根目录或任何子目录中对 favicon.ico 的所有请求重定向到 /images/favicon.ico
【问题讨论】:
如何将根目录或任何子目录中对 favicon.ico 的所有请求重定向到 /images/favicon.ico
【问题讨论】:
试试这个规则:
RewriteEngine on
RewriteRule ^favicon\.ico$ /images/favicon.ico [L]
编辑 对于具有任意路径段深度的 favicon.ico:
RewriteCond $0 !=images/favicon.ico
RewriteRule ^([^/]+/)*favicon\.ico$ /images/favicon.ico [L]
【讨论】:
对于www.mysite.com/images/favicon.ico 的网站图标
最稳健的方法是:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico$ [NC]
RewriteCond %{HTTP_HOST} (.+)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301,L,NC]
解释:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico [NC] :
- 确保在请求正确的 URI 时重定向规则不适用(例如,301 重定向会将正确的网站图标 URI 写入浏览器缓存 - 如果浏览器请求正确的 URI,则此行避免处理规则)
- [NC] 表示不区分大小写
RewriteCond %{HTTP_HOST} (.+) :
- 检索 http 主机名 - 避免将主机名硬编码到 RewriteRule
- 这意味着您可以毫无问题地在本地/测试服务器和生产服务器之间复制您的 .htaccess 文件(或者需要将您的新站点基础 url 重新硬编码到您的 RewriteRule 中)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301, L] :
- ^ 是正则表达式的开始
- (.*) 是一个通配符组 - 这意味着在 URI 中 favicon 之前可以有零个或任意数量的字符(即,这是允许根目录或任何子目录包含在 URI 匹配中的部分)
- \.(ico|gif|png|jpe?g) 检查 URI 扩展是否匹配 .ico、.gif、.png、.jpg、.jpeg 中的任何一个
- $ 是正则表达式的结尾
- http://%1/images/favicon.ico 是重定向 url - 它注入了我们在之前的 RewriteCond 中检索到的主机名。请注意,%1 被称为RewriteCond backreference,这意味着它是最后一个遇到的RewriteCond。 (例如,%2 将是倒数第二个遇到的RewriteCond)
- R=301 表示它是永久重定向 - 它将重定向存储在浏览器缓存中。测试时要小心——您需要在代码更改之间删除浏览器缓存,否则重定向不会更新。在您知道该规则有效之前,可能会忽略它。
- L 表示它在此 .htaccess 文件中要遵循的最后一个重定向 - 您不需要这个来使规则生效,因为一旦浏览器被定向到正确的 url,将不会满足第 1 行。如果没有第 1 行或L,RewriteRule 将导致永久循环(因为重定向 URL 将继续满足RewriteRule 条件)。但是,如果您有其他遵循 favicon 规则的规则,最好还是添加 L - 因为在 favicon.ico 请求中,您可以(可能)忽略以下任何规则。
您可以在http://htaccess.mwl.be/ 测试.htaccess 规则
最后说明:
- 请注意,您的任何子目录中的 .htaccess 文件中没有任何其他 RewriteRule。
- 例如,如果您将 this 答案放在您的 www.mysite.com/ 根文件夹 .htaccess 文件中,则 RewriteRule (.*) xxx 类型规则在您的 www.mysite.com/images/ 文件夹中可能会混淆结果。
【讨论】:
RewriteEngine on
RewriteRule ^(.*)favicon\.ico /images/favicon.ico [L]
【讨论】:
我知道这个问题被标记为.htaccess但是,为什么不使用符号链接呢?
ln -s images/favicon.ico favicon.ico
【讨论】:
这个快速重写应该可以解决问题:
RewriteRule ^(.*)favicon.ico /images/favicon.ico
【讨论】: