【问题标题】:RewriteCond works with IE but not with Firefox or ChromeRewriteCond 适用于 IE,但不适用于 Firefox 或 Chrome
【发布时间】:2012-12-02 11:37:54
【问题描述】:

所以我昨天一整天都在寻找解决问题的方法,发现了相似之处,但没有完全匹配。我尝试编写一个 .htacces 文件,该文件应该检查​​浏览器语言,然后将用户重定向到 (GERMAN) xyz.de/?lang=de&page=$1 或 (NONGERMAN) xyz.de/?lang=en&page=$1

它应该以浏览器的语言自动加载主页。到目前为止,我没有再遇到 500 个错误,而且它在 IE 上工作得很好,并且确实以正确的语言加载了页面,这给我留下了深刻的印象。但在 Firefox 或 Chrome 中,它既不显示语言也不显示页面;如果我 var_dump($_GET) 我什么都得不到。

.htaccess

    RewriteEngine on
    RewriteCond %{HTTP_ACCEPT_LANGUAGE} ^(de|de-at|de-li|de-lu|de-ch) [NC]
    RewriteRule ^([^./]{3}[^.]*)$   /index.php?lang=de&page=$1 [QSA,L] 
    RewriteCond %{HTTP_ACCEPT_LANGUAGE} !^(de|de-at|de-li|de-lu|de-ch) [NC] 
    RewriteRule ^([^./]{3}[^.]*)$   /index.php?lang=en&page=$1 [QSA,L]<i>

[IE9] xyz.de

   var_dump($_GET)

array(2) { ["page"]=> string(0) "" ["lang"]=> string(2) "de" }

[GECKO] xyz.de

    var_dump($_GET)

数组(0) { }

[GECKO] xyz.de/home

    var_dump($_GET)

谁知道问题出在哪里???

array(2) { ["lang"]=> string(2) "en" ["page"]=> string(4) "home" }

// 改变

感谢上一篇文章,我更改了以下代码:

    RewriteCond %{HTTP:ACCEPT_LANGUAGE} !^(de) [NC]
    RewriteRule ^([^./]{3}[^.]*)$ /index.php?page=$1&lang=en [QSA,L]

    RewriteRule ^([^./]{3}[^.]*)$ /index.php?page=$1&lang=de [QSA,L]

现在它什么都不重定向,只是当我把 /home oder secondpage 或任何东西放在里面时,它总是以英文加载页面,并且它应该将页面重定向到 xyz.de/lang=[ACCEPT-LANG]&page=如果你按 xyz.de 就回家

【问题讨论】:

  • 您是否查看过您测试的每个浏览器发送的实际 HTTP 标头?他们一定是失败的原因。
  • 我想,我希望这里有人,曾经有同样的问题。标头明确发出 Accept-Language: Chrome: Accept-Language:en-US,en;q=0.8 FireFox: Accept-Language: en-US,en;q=0.5 看起来 FF&Chrome 确实将 Rewrite 写入到浏览器字段,但没有将参数写入 $_GET// 抱歉我的英语不好。
  • 您可以安全地删除第二个RewriteCond。如果第一个匹配,则重写在第一个RewriteRule 处终止。如果不是,您无论如何都想捕获所有请求...
  • 你在这里的评论让我有点困惑......你说 FF 和 Chrome 让他们的 url 显示在位置被重写?看到你的 RewriteRules 让我大吃一惊。那里没有重定向。
  • 这个正则表达式是什么意思:^([^./]{3}[^.]*)$的所有内容都以恰好三个字符开头,即句点 (.) 或斜杠 (/),然后是任何不包含句点 (.) 的字符,直到结尾?奇怪的图案...

标签: .htaccess mod-rewrite http-accept-language


【解决方案1】:

尝试使用%{HTTP:Accept-Language} 而不是%{HTTP_ACCEPT_LANGUAGE}

This的博文很有用。

【讨论】: