【问题标题】:.htaccess - redirect favicon.htaccess - 重定向网站图标
【发布时间】:2010-03-09 10:04:10
【问题描述】:

如何将根目录或任何子目录中对 favicon.ico 的所有请求重定向到 /images/favicon.ico

【问题讨论】:

    标签: apache .htaccess favicon


    【解决方案1】:

    试试这个规则:

    RewriteEngine on
    RewriteRule ^favicon\.ico$ /images/favicon.ico [L]
    

    编辑    对于具有任意路径段深度的 favicon.ico

    RewriteCond $0 !=images/favicon.ico
    RewriteRule ^([^/]+/)*favicon\.ico$ /images/favicon.ico [L]
    

    【讨论】:

    • 这适用于 /favicon.ico 但不适用于 /folder/favicon.ico 一些浏览器正在请求本地文件夹中的 favicon.ico,即使它被指定为 /images/favicon.ico 所以我想重定向当前失败的对正确位置的请求
    • 扩展这个概念,更详细的重写规则也考虑了非网站图标:stackoverflow.com/a/37107216/4378314
    【解决方案2】:

    对于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/ 文件夹中可能会混淆结果。

    【讨论】:

      【解决方案3】:
      RewriteEngine on
      
      RewriteRule ^(.*)favicon\.ico /images/favicon.ico [L]
      

      【讨论】:

      • 前面的^很重要
      • 这给了我一个内部服务器错误。是不是因为 (.*)favicon.ico 也匹配 /images/favicon.ico 所以它变成了一个循环
      • 检查了错误日志,它指出“由于可能的配置错误,请求超出了 10 次内部重定向的限制”,所以看起来它确实是重定向到自身。我该如何解决?
      • 对,我跳过了 [L] 标志。按照 Gumbo 的回复试试。
      • 我想我需要将它与 RewriteCond 一起使用来说明请求 URI 不是 /images/favicon.ico 虽然不确定语法是否正确
      【解决方案4】:

      我知道这个问题被标记为.htaccess但是,为什么不使用符号链接呢?

      ln -s images/favicon.ico favicon.ico
      

      【讨论】:

      • 因为那样我就必须在网站上的每个目录和子目录中创建一个符号链接
      • 如果服务器在根目录下寻找 favicon.ico 并且你不能在那里找到它,一个符号链接就可以了......我现在要实现这个(不被束缚到 Apache)但如果它需要在每个目录的基础上做,那么也许是时候重新考虑配置了......
      【解决方案5】:

      这个快速重写应该可以解决问题:

      RewriteRule ^(.*)favicon.ico /images/favicon.ico
      

      【讨论】:

        猜你喜欢
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2017-09-21
        • 2012-12-17
        • 2015-10-22
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多