Nginx і подвійні слеші в урл

Таке питання тим, хто користується nginx. У всіх він (nginx) видаляє повторювані слеші з урла? Саме nginx, як веб-сервер, а не modx! MODX з успіхом (301) такі урли виправляє, якщо вони йому трапляються.

Ось начитався я доків по nginx'у, гуглил, читав SO, і скрізь пишуть, що nginx повинен робити це автоматично завдяки директиві merge_slashes, яка включена за замовчуванням. І абсолютно скрізь вказують на неї.

Але вона не працює. Загалом і ніяк.

Щоб фокус вдався, мені довелося в контекстіhttpвимкнути merge_slashes: , а вже на рівні контекстуserverвручну робити перетворення: Ось тільки після цього все працює.

Тому такий вихід. Але чи це правильно? Може, я щось роблю не так? Версія nginx - 1.2.1

Коментарі: 8

Відмінно, значить, це не в мене проблема і все зробив правильно. Дякую!

І на мене так проблема надумана. Ок, дайте мені посилання на якийсь статичний html-сайт, який є в топах за смачними запитами - я його миттю викину :-)

Так, такі сайти є. І є вони тому, що робилися давно і згодом почали займати добрі позиції у пошуку. Не оновлюють їх з простої причини — щоби позиції не зіпсувати, «а то чи мало. » :-)

Так, згоден, не вдалий приклад для гугленія)) Мені він теж видає про консерви))

Ось час від часу читаю форум серця і дуже часто обговорюють те, що «молодняку» неможливо пробитися, а топи «законсервовані». Але через пошук хоча б однієї подібної теми знайти так і не вийшло. Ананаси та кавуни)

Так, при [merge_slashes=on]nginxвидаляє сліші зuri, але тільки на внутрішньому рівні - без зовнішніх (301) редиректів .

Варіант, який працює тільки при[merge_slashes = off]Конструкція, яку ви привели, має логічну помилку, через що видаляти вона буде тільки по одному слюшу (якщо поспіль ідучих слішів — кілька, буде кілька послідовних 301 редиректів), що не є добре. Уrewriteперша зірочка захопить частину слешей, залишивши конструкції//+лише 2 слеша.

Що потрібно зробити, щоб довести конструкцію до розуму:1. «Вгамувати» жадібність цієї зірочки 2. Додати символи початку та кінця рядка (не обов'язково, але бажано) 3. Максимально спростити регулярне вираження вlocation(бо воно використовується тільки для виявлення факту присутності в uri зайвих слішів)

Варіант, що працює тільки при [merge_slashes = on]А ще краще використовувати конструкцію, яка не вимагає відключенняmerge_slashes(працює тільки при включеномуmerge_slashes): Змінна$request_uriмістить вихіднийuriз вихідними аргументами запиту (до коригування веб-сервером і до будь-яких внутрішніх редиректів). Конструкція^[^?]*зліва від слешей потрібна, щоб переконатися, що зайві сліші виявлені саме вuri, а не у складі аргументів (слеши у складі аргументів не чіпаємо). І в останню чергу робимо 301 редирект наuri, який nginx вже самостійно очистив від зайвих слішів (це значення міститься в змінній$uri).

Універсальний варіант, який не залежить від стану [merge_slashes]Якщо ж потрібен універсальний варіант, який не залежить від стану директивиmerge_slashes, то робимо так (слеши у складі аргументів не чіпаємо) :