Перезаписані URL-адреси з довжиною параметра> 255 не працюють


12

Я використовую mod_rewrite, щоб переписати такі URL-адреси:

http://example.com/1,2,3,4/foo/

Роблячи це в .htaccess:

RewriteEngine On
RewriteRule ^([\d,]+)/foo/$ /foo.php?id=$1 [L,QSA]

Це працює чудово, за винятком випадків, коли "1,2,3,4" перетворюється на рядок довжиною більше 255 символів, Apache повертає "403 Заборонено".

Немає проблем із відвідуванням foo.php?id=1,2,3,4безпосередньо, навіть із дуже довгим рядком id, однак для мене це не варіант.

Чи є якась настройка Apache чи інша установка, яку я повинен налаштувати?

ОНОВЛЕННЯ : Увімкнув RewriteLog за допомогою RewriteLogLevel 9. За допомогою короткого рядка id я отримую кілька рядків у своєму журналі журналу. Але коли рядок id перевищує 255 символів, нічого не реєструється (здається, ніби mod_rewrite навіть не виконується?).

Якщо ви вважаєте це питання цікавим / корисним, будь ласка, підкажіть його.


Це може бути проблемою регулярного вираження? Ви перевірили, чи правильно написаний запит для рядків довше 255 символів? Якщо ні, можливо, ви можете опублікувати запити до і після переписування.
tomjedrz

3
Увімкніть журнал mod_rewrite за допомогою, RewriteLogі RewriteLogLevelви зможете побачити, що відповідає і як насправді переписується. Я б здогадався, що копіюється лише 255 символів $1, і це закінчується тим, idщо клієнт не має права бачити, тому Apache повертає 403. Я не переглянув код, але може бути, що Apache маніпулює зворотній зв'язок у фіксованому 256-байтовому буфері (256-й зарезервовано для завершення NULL).
Джеймс Снерінгер

Дивіться питання щодо оновлення - нічого не реєструється для довгих
парам

Відповіді:


8

Як ви думаєте, ви стикаєтесь з обмеженням файлової системи?

Може бути, максимальна довжина імені файлу становить 255 байт, і коли apache або правило mod_rewrite перевіряє, чи існує файл, помилка повертається в apache операційною системою.

Якщо ви помістите якесь правило у свій .htaccess файл, вирішити проблему вже пізно. Apache вже спробував встановити ім'я файлу та помилку викинутої файлової системи '(36) Ім'я файлу занадто довго', повертаючи помилку 403.

Можливо, ви можете змінити шаблон URL-адреси всередині додатка. до максимум 255 знаків від косої до косої.

EDIT: шукайте тут детальну відповідь на це питання. Я взяв у мене своє місце.


Так, це зараз все, що ми можемо зробити, я сподіваюся на вирішення проблеми чи налаштування.
philfreo

3
Microspino. Схоже, ви вирізали та вставили частину своєї відповіді з відповіді @Jeff Clark тут: serverfault.com/questions/120397/… . Вам слід гіперпосилання на цю відповідь, щоб він отримав деяку відомість.
Стефан Ласєвський

@Stefan lasieswski: ти правий, я додав посилання.
мікроспіно

тож, ти думаєш, можливо, Apache намагається статифікувати запитуваний файл незалежно - я маю на увазі, це може бути єдиним способом пояснити, що занадто довга URL-адреса навіть не вибирається механізмом перезапису ...
HorusKol

Так, це моя ідея, хоча я думаю, що в цілому такі тривалі URL-адреси та назви файлів слід уникати з кількох причин. Тож найкраща порада, на яку я можу подумати, - це змінити щось у шаблоні URL, якщо ім'я файлу вже не надто довге.
мікроспіно

2

Там в аналогічне питання про це межі тут :

Можливо, ви стикаєтесь з обмеженням базової файлової системи

Я не знаю, чи використовуєте ви REQUEST_FILENAME десь у вашій конфігурації .htaccess, тому не знайте, чи надане рішення працює.


Це має сенс, але ні, я ні. Я відредагував своє запитання, щоб включити файл .htaccess у повному обсязі. Інші ідеї?
філфрео

Згідно з "Технічними подробицями Apache mod_rewrite" на httpd.apache.org/docs/trunk/rewrite/tech.html "Хоча mod_rewrite переписує URL-адреси в URL-адреси, URL-адреси до іменних файлів і навіть назви файлів на ім'я файлів, API наразі надає лише URL-адресу для -файл гачок. ". Тож навіть якщо ви не потрапляєте до фактичного файлу, можливо, URL-адреса, яка займає ім'я файлу, досягає обмеження ресурсу ОС?
Стефан Ласєвський

0

Однозначно цікаве питання. Ви запускаєте mod_security і якщо так, спробуйте без нього? Можливо, йому просто не подобаються назви довгих шляхів або назви довгих шляхів із незашифрованими комами? ^^

Хоча він інстинктивно відчуває більше обмеження шляху до URL-адреси або принаймні окремих його сегментів або інтерпретації основної файлової системи, як писав GmonC. Це також пояснило б, чому регулярний URL з довгою частиною в рядку запиту працює добре.

Я думаю, що у старших ASP.NET раніше обмеження шляху запиту становило ~ 260 символів.


Дивіться оновлення для запитання. І ні, я не бачу файл mod_security у /usr/include/apache2/або /usr/lib/apache2/modules/(але я бачу mod_rewrite там), тому я припускаю, що він не встановлений.
philfreo

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.