apache:在查询字符串(URL)中转义的变音符号导致403

ste*_*efs 8 php apache configuration internationalization

我有一个我以前从未遇到的问题,我认为它与apache配置有关,我不是很精通.

首先,有一个带有搜索表单的php脚本.表格通过POST传输.

然后是搜索命中的结果列表.这里原始搜索查询作为url的一部分传递,例如:search.php?id = 1234&query = foo.这也有效 - 只要没有变音符号(äöüÄÖÜß...)字符传输.

只要我在搜索查询中包含变音符号,将查询字符串作为POST传输的第一部分就可以工作,但是在URL中传递它(urlencoded)会导致403.

所以:

  • search.php?id=1234&query=bar 作品
  • search.php?id=1234&query=b%E4r 导致403(%E4 ="ä"utf-8 urlencoded)
  • search.php?id=1234&query=b%C3%A4r 导致403(%C3%A4 ="ä"utf-8 urlencoded)
  • 通过POST提交变音符号

我将应用程序从iso-8859-1转换为utf-8,但这没有任何区别.

我也在我的本地机器上进行了测试,在这里它完美无缺 - 正如预期的那样.

远程服务器设置(它不起作用):

Apache/2.2.12(Ubuntu),
PHP版本5.2.10-2ubuntu6.7,Suhosin补丁0.9.7,通过CGI/FastCGI

本地设置(这里是相同的工作):

Apache/2.2.8(Win32)PHP/5.3.5
PHP版本5.3.5通过mod_php

有没有人知道为什么远程apache/php-cgi不接受url中正确的urlencoded变音符号?

额外的信息:我也试图创建一个有名字的变音静态文件,都/t%C3%A4st.php/täst.php没有问题得到服务.täst.php?foo=täst失败.

注意:?foo=%28,%28是"(",也适用.

Sei*_*gen 1

Apache 无法逃脱这一点,浏览器却可以。

您需要使用urlencodeurldecode来避免此类字符出现问题。

有些浏览器,比如旧的 Netscape,只发送书面的 url,其中包含 8 位字符。其他的,特别是 MSIE,在将 url 发送到 Web 服务器之前将其编码为 UTF-8,因此 8 位字符以两个字符的形式到达,其中第一个字符设置了第 8 位。在请求标头或其他地方没有任何迹象表明 url 是用 UTF-8 编码的。