Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Apache

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как побороть Error 403 при открытии длинных url на сайте
 
 автор: qwr938   (24.11.2011 в 11:55)   письмо автору
 
 

На моём сайте есть длинные url на кириллице и при их открытии сервер выдаёт Error 403.

При этом если длина строки между слэшами "/" в url меньше 730-750 символов, то ошибка не возникает, если больше - возникает.

Пример:

http://адрес_сайта/500_символов/500_символов/ - ошибки не возникает, хотя общая длина строки больше 1000 символов
http://адрес_сайта/800_символов/ - ошибка возникает, поскольку длина строки между слэшами больше 730-750 символов.

Хостинг VPS, поэтому доступ к любому файлу у меня есть. Подскажите, как побороть ошибку.

  Ответить  
 
 автор: cheops   (24.11.2011 в 12:08)   письмо автору
 
   для: qwr938   (24.11.2011 в 11:55)
 

>меньше 730-750 символов
Дело в том, что строка запроса как раз примерно таким количеством символов и ограничено... тут ничего поделать практически невозможно - протоколы такие - нужно как-то ужиматься.

  Ответить  
 
 автор: qwr938   (24.11.2011 в 12:44)   письмо автору
 
   для: cheops   (24.11.2011 в 12:08)
 

А что это за протокол такой, который позволяет передавать строку
/500_символов/500_символов/
но не строку
/800_символов/

  Ответить  
 
 автор: cheops   (24.11.2011 в 12:54)   письмо автору
 
   для: qwr938   (24.11.2011 в 12:44)
 

Протокол HTTP, метод GET. Тут все просто, строка метода GET помещается в один HTTP-заголовок, длина которого не может быть неограниченной... если данные такие длинные, их нужно передавать в теле HTTP-документа, а не в районе заголовков. А передача данных в теле документа - это уже метод POST. Реальные системы бы может на это закрывали бы глаза, но Web-сервер должен заботиться о своей безопасности, о том, чтобы не происходило переполнение буфера, поэтому это требование выполняют четко.

  Ответить  
 
 автор: qwr938   (24.11.2011 в 13:18)   письмо автору
 
   для: cheops   (24.11.2011 в 12:54)
 

То есть проблема в том, что на хостинге стоит ограничение примерно в 800 знаков на передачу данных методом GET, и на VPS-хостинге я не могу увеличить это значение, скажем, до 1200 знаков?

Или же всё-таки могу, но тогда вопрос: где и что нужно прописать?

  Ответить  
 
 автор: cheops   (24.11.2011 в 13:43)   письмо автору
 
   для: qwr938   (24.11.2011 в 13:18)
 

Вообще говоря можно. Есть директива LimitRequestLine вот она и задает количество символов, допустимых в строке запроса. Но воспользоваться ей может только администратор в httpd.conf, т.е. задать её через .htaccess не получится.
LimitRequestLine 8192
размер указывается в байтах.

  Ответить  
 
 автор: cheops   (24.11.2011 в 13:47)   письмо автору
 
   для: qwr938   (24.11.2011 в 13:18)
 

>VPS-хостинге я не могу увеличить это значение, скажем, до 1200 знаков?
Вообще говоря может статься, что и VPS не потребуется, если настройки руками не трогать, в новых Apach-ах под строку запроса отводится 8Кб. Можно даже попробовать вашему хостеру намекнуть, что такая короткая строка - это ретроградство (сначала, просто внимания не обратил, что у вас меньше 1Кб в запросе, вообще норма для современных систем - 8Кб).

  Ответить  
 
 автор: qwr938   (24.11.2011 в 14:29)   письмо автору
 
   для: 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>


Возможно, строку

LimitRequestLine 8192

нужно прописать куда-то сюда?

  Ответить  
 
 автор: cheops   (24.11.2011 в 15:35)   письмо автору
 
   для: qwr938   (24.11.2011 в 14:29)
 

1. Сервер перезагружали?
2. В начало не нужно, лучше ближе к концу.

>В файле httpd.conf нашёл такой закомментированный участок кода:
Это осталось от первоначальной установки, у вас сейчас наверное виртуальные хосты, поэтому надобность в этом разделе отпала - вдите он закомментирован (в начале каждой строки стоит диез #). Этот контейнер используется, когда нет виртуальных хостов.

  Ответить  
 
 автор: qwr938   (24.11.2011 в 15:59)   письмо автору
 
   для: cheops   (24.11.2011 в 15:35)
 

Перенёс строчку в самый конец, но эффекта ноль.
Сервер перезагружал через панель Plesk и командой service httpd restart.

  Ответить  
 
 автор: cheops   (24.11.2011 в 16:39)   письмо автору
 
   для: qwr938   (24.11.2011 в 15:59)
 

Вообще так резать URL могут и модули безопасности... это обрезание имеет место только в случае каких-то определенных программ или всегда?

PS Попробуйте провести эксперемент создать десяток вложенных папок, таким образом, чтобы к файлу в самой вложенной папке пришлось обращаться при помощи URL, сильно превышающий 1000 символов. Сохраняется эффект или нет? Может мы зря на Apache думаем? Хотя почитал первый пост - вы это уже сделали, вы знаете это скорее всего ни фига не Apache - у него ограничения на всю строку, не на отдельные папки... А это что за адреса (PHP, HTML, папки mod_rewrite - в общем, кто еще участвует в формировании адреса)?

  Ответить  
 
 автор: qwr938   (24.11.2011 в 17:41)   письмо автору
 
   для: 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. Но файл здесь не причём, поскольку если сделать этот файл пустым, то ошибка сохранится, а если бы проблема была в нём, то браузер выдал бы чистый лист. То есть ответ - да, всегда.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования