nginx нечутливий перезапис


15

Я намагаюся зробити мої перенаправлення на nginx максимально чистими. Я розумію, що ~ * є нечутливим до регістру, але я можу змусити його працювати лише в прикладі 2.

Приклад 1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Приклад 2 - Це працює, але це не так ефективно, як рядок вище.

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }

Чи існує спосіб зробити нечутливі перенаправлення з прикладу 1, не заплутавшись?

Спасибі.

Відповіді:


10

Я просто (і виправив) цю саму проблему і опинився тут, намагаючись знайти відповідь. Документація nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) не чітко визначає, що ~ * працює лише всередині оператора if, але, мабуть, так і є.

Щоб отримати невідчутне до регістру регулярне вираження відповідності для переписування URL-адреси ngnix за межами оператора if, мені довелося використовувати стиль Apache / Perl:

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Дивіться http://perldoc.perl.org/perlretut.html (пошук нечутливих). Також здається, що префіксація (? I) поза певною групою захоплення змушує застосовувати її до всього рядка пошуку. Примітка. Це, здається, не працює з "^ (? I) foobar", оскільки здається, що "^" мається на увазі.

Однак, щоб бути впевненим, і щоб зробити будь-які майбутні переписування простішими в обслуговуванні та менш неоднозначними, якщо ви, нарешті, зробите купу з них, ви можете зробити щось подібне:

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}

Сподіваюся, це допомагає ...


30

Що я знайшов, щоб зробити цю роботу:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Вам потрібно лише зробити це:

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

Це просто означає додавання (? I), інакше для збігу все те саме.


4
Це має бути прийнятою відповіддю.
thekingoftruth

2
Дякую. Настільки прості, але все ж такі важкі для пошуку в документах Nginx. Багато вдячний за стислий вказівник!
PKHunter

1

Працюючи над веб-сайтом зараз, я виявив, що це також працює. Для будь-яких людей, які перебувають у тій же ситуації, я був у ці останні кілька годин.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.