Regex lokasi Nginx tidak berfungsi dengan izin proxy

44

Saya mencoba agar 2 arahan lokasi ini berfungsi di Nginx tapi saya mendapatkan beberapa kesalahan saat mem-boot Nginx.

   location ~ ^/smx/(test|production) {
        proxy_pass   http://localhost:8181/cxf;
    }

    location ~ ^/es/(test|production) {
        proxy_pass   http://localhost:9200/;
    }

Ini adalah kesalahan yang saya terima:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block

Apakah itu terdengar akrab bagi siapa pun? Apa yang saya lewatkan di sini?

Niels
sumber

Jawaban:

49

Tambahan kecil untuk jawaban hebat dari Xaviar :

Jika Anda tidak terlalu mengenal nginx, ada perbedaan penting antara menambahkan garis miring pada akhir proxy_passinstruksi.

Berikut ini tidak berfungsi:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend/;

tapi yang ini:

location ~* ^/dir/ {
  rewrite ^/dir/(.*) /$1 break;
  proxy_pass http://backend;

Perbedaannya adalah /pada akhir proxy_passarahan.

95%
sumber
1
Trailing itu /memperbaiki masalah konfigurasi saya, sulit ditangkap, terima kasih!
Yorch
Membuatku gila, terima kasih telah menunjukkan itu!
cyrrill
22

Ini memberitahu Anda bahwa URI dalam direktif pass proxy tidak dapat digunakan di lokasi regex. Ini karena nginx tidak dapat menggantikan bagian dari URI yang cocok dengan regex di locationblok dengan yang dilewatkan di proxy_passdirektif dengan cara generik.

Bayangkan saja regex lokasi Anda /foo/(.*)/bar, dan Anda tentukan proxy_pass http://server/test, nginx harus memetakan regex lokasi Anda ke yang lain di tingkat atas karena Anda tidak ingin mengakhirinya /foo/test/bar/somethingtetapi dengan /test/something. Jadi itu tidak mungkin secara asli.

Jadi untuk bagian ini menggunakan yang berikut ini harus berfungsi:

server {

   [ ... ]

    location ~ ^/smx/(test|production) {
        rewrite ^/smx/(?:test|production)/(.*)$ /cxf/$1 break;
        proxy_pass http://localhost:8181;
    }

    location ~ ^/es/(test|production) {
        rewrite ^/es/(?:test|production)/(.*)$ /$1 break;
        proxy_pass http://localhost:9200;
    }

}

Namun, penulisan ulang pengalihan tidak cocok dengan pola blok lokasi URI karena pengubahan penulisan URI saat ini sedang diproses, sehingga tidak mungkin untuk mengubah Locationheader berdasarkan permintaan awal sebelum menulis ulang.

Xavier Lucas
sumber
2
memindahkan jalan ke aturan penulisan ulang bekerja untuk saya. Terima kasih.
sonjz