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

时间:2011-02-01 12:50:55

标签: 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不能在网址中正确接受urlencoded的变音符号?

其他信息:我还尝试创建一个带有变音符号名称的静态文件,/t%C3%A4st.php/täst.php都可以正常使用。 täst.php?foo=täst失败。

注意:?foo=%28,其中%28为“(”,也适用。

1 个答案:

答案 0 :(得分:1)

Apache不会逃避这一点,浏览器会这样做。

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

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