apache: экранированный умлаут в строке запроса (URL) приводит к 403 - PullRequest
8 голосов
/ 01 февраля 2011

У меня есть проблема, с которой я никогда не сталкивался раньше, и я думаю, что это как-то связано с конфигурацией apache, в которой я не очень хорошо разбираюсь.

Во-первых, есть PHP-скрипт с формой поиска. форма передается через POST.

тогда есть список результатов поисковых хитов. здесь исходный поисковый запрос передается как часть URL, например: search.php? id = 1234 & query = foo. это также работает - до тех пор, пока не будут переданы символы умлаутов (äöüÄÖÜß ...).

как только я включаю умлауты в поисковый запрос, первая часть, которая передает строку запроса, когда работает POST, но ее передача (urlencoded) в URL приводит к 403.

так:

  • search.php?id=1234&query=bar работает
  • search.php?id=1234&query=b%E4r приводит к 403 (% E4 = "ä" utf-8 с кодировкой Urlen)
  • search.php?id=1234&query=b%C3%A4r приводит к 403 (% C3% A4 = "ä" utf-8 с кодировкой Urf)
  • отправка умлаутов через POST Works

я преобразовал приложение из iso-8859-1 в utf-8, но это не имело значения.

Я также протестировал его на своей локальной машине, здесь он работает безупречно - как и ожидалось.

настройка удаленного сервера (там, где он не работает):

Apache / 2.2.12 (Ubuntu),
Версия PHP 5.2.10-2ubuntu6.7, Suhosin Patch 0.9.7, через CGI / FastCGI

локальная настройка (здесь тоже самое работает):

Apache / 2.2.8 (Win32) PHP / 5.3.5
Версия PHP 5.3.5 через mod_php

Кто-нибудь знает, почему удаленный apache / php-cgi не принимает правильно url-кодированные умлауты в URL?

дополнительная информация: я также пытался создать статический файл с умлаутом в названии, и оба /t%C3%A4st.php и /täst.php обслуживаются без проблем. täst.php?foo=täst не удается.

примечание: ?foo=%28, где% 28 - "(", также работает.

1 Ответ

1 голос
/ 09 апреля 2012

Apache не избегает этого, браузер делает.

Вам необходимо использовать urlencode и urldecode , чтобы избежать проблем с символами такого типа.

Некоторые браузеры, такие как старый Netscape, просто отправляют URL как написано, с 8-битными символами в нем. Другие, в частности MSIE, перед отправкой на веб-сервер кодируют URL-адрес как UTF-8, поэтому 8-битный символ прибывает как два символа, из которых первый имеет 8-й бит. В заголовках запросов или где-либо еще не указано, что URL кодируется в UTF-8.

...