|
|
|
| На моём сайте есть длинные url на кириллице и при их открытии сервер выдаёт Error 403.
При этом если длина строки между слэшами "/" в url меньше 730-750 символов, то ошибка не возникает, если больше - возникает.
Пример:
http://адрес_сайта/500_символов/500_символов/ - ошибки не возникает, хотя общая длина строки больше 1000 символов
http://адрес_сайта/800_символов/ - ошибка возникает, поскольку длина строки между слэшами больше 730-750 символов.
Хостинг VPS, поэтому доступ к любому файлу у меня есть. Подскажите, как побороть ошибку. | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 11:55)
| | >меньше 730-750 символов
Дело в том, что строка запроса как раз примерно таким количеством символов и ограничено... тут ничего поделать практически невозможно - протоколы такие - нужно как-то ужиматься. | |
|
|
|
|
|
|
|
для: cheops
(24.11.2011 в 12:08)
| | А что это за протокол такой, который позволяет передавать строку
/500_символов/500_символов/
но не строку
/800_символов/ | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 12:44)
| | Протокол HTTP, метод GET. Тут все просто, строка метода GET помещается в один HTTP-заголовок, длина которого не может быть неограниченной... если данные такие длинные, их нужно передавать в теле HTTP-документа, а не в районе заголовков. А передача данных в теле документа - это уже метод POST. Реальные системы бы может на это закрывали бы глаза, но Web-сервер должен заботиться о своей безопасности, о том, чтобы не происходило переполнение буфера, поэтому это требование выполняют четко. | |
|
|
|
|
|
|
|
для: cheops
(24.11.2011 в 12:54)
| | То есть проблема в том, что на хостинге стоит ограничение примерно в 800 знаков на передачу данных методом GET, и на VPS-хостинге я не могу увеличить это значение, скажем, до 1200 знаков?
Или же всё-таки могу, но тогда вопрос: где и что нужно прописать? | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 13:18)
| | Вообще говоря можно. Есть директива LimitRequestLine вот она и задает количество символов, допустимых в строке запроса. Но воспользоваться ей может только администратор в httpd.conf, т.е. задать её через .htaccess не получится.
размер указывается в байтах. | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 13:18)
| | >VPS-хостинге я не могу увеличить это значение, скажем, до 1200 знаков?
Вообще говоря может статься, что и VPS не потребуется, если настройки руками не трогать, в новых Apach-ах под строку запроса отводится 8Кб. Можно даже попробовать вашему хостеру намекнуть, что такая короткая строка - это ретроградство (сначала, просто внимания не обратил, что у вас меньше 1Кб в запросе, вообще норма для современных систем - 8Кб). | |
|
|
|
|
|
|
|
для: cheops
(24.11.2011 в 13:47)
| | Прописал указанную строку в файлах httpd.conf и swtune.conf (на всякий случай) и перезапустил сервер через панель Plesk, но ошибка никуда не делась.
Строку поместил в самом начале каждого файла, поскольку файлы httpd.conf и swtune.conf не содержат строк с LimitReques*.
В файле httpd.conf нашёл такой закомментированный участок кода:
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
|
Возможно, строку
нужно прописать куда-то сюда? | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 14:29)
| | 1. Сервер перезагружали?
2. В начало не нужно, лучше ближе к концу.
>В файле httpd.conf нашёл такой закомментированный участок кода:
Это осталось от первоначальной установки, у вас сейчас наверное виртуальные хосты, поэтому надобность в этом разделе отпала - вдите он закомментирован (в начале каждой строки стоит диез #). Этот контейнер используется, когда нет виртуальных хостов. | |
|
|
|
|
|
|
|
для: cheops
(24.11.2011 в 15:35)
| | Перенёс строчку в самый конец, но эффекта ноль.
Сервер перезагружал через панель Plesk и командой service httpd restart. | |
|
|
|
|
|
|
|
для: qwr938
(24.11.2011 в 15:59)
| | Вообще так резать URL могут и модули безопасности... это обрезание имеет место только в случае каких-то определенных программ или всегда?
PS Попробуйте провести эксперемент создать десяток вложенных папок, таким образом, чтобы к файлу в самой вложенной папке пришлось обращаться при помощи URL, сильно превышающий 1000 символов. Сохраняется эффект или нет? Может мы зря на Apache думаем? Хотя почитал первый пост - вы это уже сделали, вы знаете это скорее всего ни фига не Apache - у него ограничения на всю строку, не на отдельные папки... А это что за адреса (PHP, HTML, папки mod_rewrite - в общем, кто еще участвует в формировании адреса)? | |
|
|
|
|
|
|
|
для: cheops
(24.11.2011 в 16:39)
| | Введённый в адресную строку браузера url обрабатывается модулем mod_rewrite, но мне не кажется, что дело в нём и вообще в файле .htaccess.
Провёл такой эксперимент: удалил файл .htaccess и обратился к http://адрес_сайта/800_символов/, получил Error 403. Затем сократил число символов в запросе до 700 и получил Error 404 - так и должно быть, поскольку файл по такому адресу физически не существует.
Модулей безопасности на своём VPS я не использую. Возможно, хостер как-то фильтрует данные. Самое интересное, что это мой второй хостер, а проблема та же.
>это обрезание имеет место только в случае каких-то определенных программ или всегда?
Не понял вопрос. Отвечу как понял. Все url проходят через mod_rewrite. Если url удовлетворяет правилу, то он передается на обработку файлу. Но если длина запроса между слэшами превышает 730-750 знаков, то получаю Error 403. Но файл здесь не причём, поскольку если сделать этот файл пустым, то ошибка сохранится, а если бы проблема была в нём, то браузер выдал бы чистый лист. То есть ответ - да, всегда. | |
|
|
|