nginx case insensitive rewrite

15

Saya mencoba membuat pengalihan nginx saya sebersih mungkin. Saya mengerti ~ * adalah untuk case-sensitive tetapi saya hanya bisa membuatnya bekerja pada contoh 2.

Contoh 1

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

Contoh 2 -Ini bekerja, tetapi tidak seefisien garis di atas.

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

Apakah ada cara untuk melakukan arahan ulang yang tidak peka terhadap kasus dengan contoh 1 tanpa membuatnya terlalu berlumpur?

Terima kasih.

milleruni
sumber

Jawaban:

10

Saya baru saja (dan memperbaiki) masalah yang sama ini dan akhirnya mencoba menemukan jawabannya. Dokumentasi nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ), tidak secara jelas menyatakan bahwa ~ * hanya berfungsi di dalam pernyataan if, tetapi ternyata, itulah masalahnya.

Untuk mendapatkan pencocokan ekspresi reguler case-insensitive untuk URL ngnix menulis ulang di luar pernyataan if, saya harus menggunakan gaya Apache / Perl:

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

Lihat http://perldoc.perl.org/perlretut.html (mencari yang tidak sensitif). Tampaknya juga awalan (? I) di luar grup tangkapan khusus membuatnya berlaku untuk seluruh string pencarian. Catatan: Ini BUKAN berfungsi dengan "^ (? I) foobar" karena tampaknya "^" tersirat.

Hanya untuk memastikan, dan untuk membuat penulisan ulang di masa depan lebih mudah untuk dipertahankan dan kurang ambigu jika Anda akhirnya melakukan banyak dari mereka, Anda mungkin ingin melakukan sesuatu seperti ini:

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

Semoga ini membantu...

PengacaraOnLinux
sumber
30

Apa yang saya temukan untuk membuat ini bekerja:

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

Anda hanya perlu melakukan ini:

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

Ini hanya berarti prepend (? I) dan sebaliknya semuanya sama untuk pencocokan.

ogrrd
sumber
4
Ini harus menjadi jawaban yang diterima.
thekingoftruth
2
Terima kasih. Sangat sederhana, namun sangat sulit ditemukan di Nginx docs. Sangat menghargai pointer singkat!
PKHunter
0

Bekerja di situs web sekarang saya menemukan ini tampaknya berfungsi juga. Untuk setiap orang dalam situasi yang sama, saya berada dalam beberapa jam terakhir ini.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
Pocketninja
sumber