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, то робимо так (слеши у складі аргументів не чіпаємо) :