【问题标题】:.htaccess Redirect to specific webpage based on browser.htaccess 根据浏览器重定向到特定网页
【发布时间】:2012-12-13 00:20:40
【问题描述】:

我想根据访问者使用的浏览器将访问者重定向到我的特定页面。

例如:所有访问者都会首先访问http://www.example.com/xy/abc.html

如果访问者使用的是firefox,他应该被重定向到http://www.example.com/xy/firefox.html

如果访问者使用的是 chrome,他应该被重定向到http://www.example.com/xy/chrome.html

我想为 opera、chrome、firefox、IE、safari 浏览器处理此问题,并为未识别的浏览器设置默认重定向。

对代码有帮助吗?我尝试查找,我发现所有浏览器都是一个重定向代码,而不是一个特定的。

感谢您的帮助。谢谢。

【问题讨论】:

    标签: apache .htaccess webserver


    【解决方案1】:

    以下重写规则将对 tecmint.html 的请求重定向到 tecmint-chrome.html、tecmint-firefox.html 或 tecmint-ie.html,具体取决于所使用的浏览器(Google Chrome、Mozilla Firefox 或 Internet Explorer) .

    为此,HTTP_USER_AGENT 环境变量用于根据用户代理字符串识别浏览器。这里我们介绍 RewriteCond 指令,它允许我们指定一个必须满足的条件才能进行重定向。

    RewriteCond "%{HTTP_USER_AGENT}"  ".*Firefox.*"
    RewriteRule "^/tecmint\.html$"      "/tecmint-firefox.html" [R,L]
    RewriteCond "%{HTTP_USER_AGENT}"  ".*Chrome.*"
    RewriteRule "^/tecmint\.html$"      "/tecmint-chrome.html" [R,L]
    RewriteCond "%{HTTP_USER_AGENT}"  ".*Trident.*"
    RewriteRule "^/tecmint\.html$"      "/tecmint-ie.html" [R,L]
    

    参考:https://www.tecmint.com/mod_rewrite-redirect-requests-based-on-browser/

    【讨论】:

      【解决方案2】:

      您可以使用 mod_rewrite 的 RewriteCond directive 来测试报告的用户代理名称。在放置在 xy 目录中的 .htaccess 文件中,它看起来像这样:

      RewriteCond %{HTTP_USER_AGENT} Opera
      RewriteRule ^abc.html$ http://example.com/xy/opera.html [R=301]
      

      这会将在其用户代理字符串中某处包含 Opera 的浏览器永久重定向到 opera.html。您可以在useragentstring.com 上找到用户代理如何识别自己的一个不错的列表。您会注意到许多用户代理字符串实际上以“Mozilla”开头(由于一些邪恶的历史原因),但只需测试字符串是否包含浏览器的名称(IE 是“MSIE”)就足够了。

      问题是,HTTP_USER_AGENT 字符串是由浏览器报告的,并且浏览器可能会报告他们想要的任何内容。 Opera 甚至有一个内置选项可以将自己伪装成 IE 或 FF。通常,基于用户代理字符串的浏览器嗅探很有可能最终会错过,然后用户会感到恼火。我强烈建议您让用户以某种方式覆盖自动重定向。


      因此,第一种方法可能是这样的:

      RewriteEngine on
      
      RewriteCond %{HTTP_USER_AGENT} Opera
      RewriteRule ^abcd.html$ opera.html [NC,L]
      
      RewriteCond %{HTTP_USER_AGENT} MSIE
      RewriteRule ^abcd.html$ ie.html [NC,L]
      
      RewriteCond %{HTTP_USER_AGENT} Chrome
      RewriteRule ^abcd.html$ chrome.html [NC,L]
      
      RewriteCond %{HTTP_USER_AGENT} Safari
      RewriteRule ^abcd.html$ safari.html [NC,L]
      
      RewriteCond %{HTTP_USER_AGENT} Firefox
      RewriteRule ^abcd.html$ firefox.html [NC,L]
      
      RewriteRule ^abcd.html$ default.html [L]
      

      L 标志确保该规则是该通道中要执行的最后一个规则,因此如果浏览器报告自己带有包含 Firefox、Safari、MSIE 和 Opera 的字符串,则匹配的第一个规则(在本例中为 Opera ) 将确定着陆页。此版本执行软重定向(浏览器的地址栏不会改变)。如果您想要硬性的 R=301 重定向,请务必拼出着陆页的整个 URL,即RewriteRule ^abcd.html$ http://example.com/xy/opera.html [NC,L,R=301]

      【讨论】:

      • 谢谢。对于某些用户来说,我实际上并不是很担心它是否会失败。并不是真的期望 100% 有效的解决方案,但任何接近 85% 的解决方案都应该没问题。
      • 澄清一下,我把这段代码放在一起,你觉得这样好吗?
        RewriteCond %{HTTP_USER_AGENT} Opera RewriteRule ^abc.html$ opera.html [R=301] RewriteCond %{HTTP_USER_AGENT} Mozilla RewriteRule ^abc.html$ ff.html [R=301]
        另一个问题,chrome 也使用了 Mozilla,这意味着重定向对于 chrome 用户来说是不准确的。
      • 添加了一个示例实现。似乎可以在我的机器上运行,但请务必对其进行测试:)。
      • 感谢完美。非常感谢您的帮助。我想知道应该为 Android、iPhone、Windows Phone 设备使用什么用户代理?你有什么想法吗?
      • 它仍然取决于浏览器(useragentstrings.com 有 a list for mobile browsers),尽管浏览器确实倾向于在 UA 中报告其平台,因此您可以仅检查“Android”等。但是,如果您只想查看用户是否使用移动设备,最好检查 Profile 或 x-wap-profile http 标头字段。详情请见this question
      猜你喜欢
      • 2016-10-18
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 2012-06-19
      • 1970-01-01
      • 2013-08-30
      相关资源
      最近更新 更多