bagaimana cara menghapus blok lokasi dari $ uri dalam konfigurasi nginx?

16

Saya memiliki penulisan ulang dalam file conf ngix saya yang berfungsi dengan baik kecuali tampaknya menyertakan blok lokasi sebagai bagian dari variabel $ uri. Saya hanya ingin jalan setelah blok lokasi. Kode konfigurasi saya saat ini adalah:

location /cargo {
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}

Menggunakan contoh url dari http://localhost/cargo/testpagekarya redirect, namun nilai parameter "_REWRITE_COMMAND" yang diterima oleh file php saya adalah "/ cargo / testpage". Saya perlu membuka blok lokasi dan hanya memiliki "testpage" sebagai $ uri

Saya cukup yakin ada sintaks regex untuk membagi $ uri dan menetapkannya ke variabel baru menggunakan $ 1 $ 2 dll, tetapi saya tidak dapat menemukan contoh untuk melakukan hanya tugas variabel menggunakan regex yang bukan bagian dari penulisan ulang pernyataan. Saya sudah mencari dan mencoba selama berjam-jam dan sepertinya saya tidak bisa melewati langkah terakhir ini.

Saya juga tahu saya bisa menghapus ini pada kode aplikasi, tetapi alasan saya ingin mencoba memperbaikinya di nginx conf adalah untuk alasan kompatibilitas karena juga berjalan di Apache. Saya juga harus mengatakan bahwa saya telah menemukan cara yang benar-benar gila untuk melakukannya, tetapi itu melibatkan pernyataan "jika" untuk memeriksa keberadaan file dan dokumentasi secara khusus mengatakan tidak melakukannya dengan cara itu.

Jason
sumber

Jawaban:

18

Melihat sekeliling saya kira bahwa menggunakan lokasi regexp dengan tangkapan adalah yang termudah. Mengadaptasi contoh Anda, saya berakhir dengan:

location ~ ^/cargo(.*) {
    try_files $1 $1/ /cargo/index.php?_REWRITE_COMMAND=$1&args;
}
Theuni
sumber
aha, sangat sederhana sekali seseorang menunjukkannya padamu! Saya harus membuat beberapa revisi kecil untuk menangani penulisan ulang url root ke lokasi yang benar. Saya mengajukan jawaban dalam pertanyaan karena saya tidak dapat melakukan pemformatan dalam komentar ini. Satu-satunya peringatan yang tersisa adalah bahwa blok php sekarang harus berada di atas blok lokasi ini atau kalau tidak loop pengalihan tak terbatas dibuat (karena / kargo menjadi regex dan url redirect juga berisi / kargo). tidak yakin apakah ada cara lain untuk mencegah hal itu terjadi?
Jason
Saya sarankan membaca tentang pemesanan lokasi regexp dan non-regexp. Saya biasanya beralih untuk membuat semua lokasi regexp di beberapa titik karena kemudian pemesanan ditentukan oleh urutan dalam file konfigurasi bukan kekhususan pertandingan.
Theuni
keren terima kasih, saya membayangkan apa yang akan membuat regex di atas lebih baik jika cocok / kargo / (apa pun kecuali index.php) maka itu akan mencegah kesalahan server karena loop penulisan ulang yang tak terbatas.
Jason
3

Saya menemukan hal lain yang bekerja untuk saya (karena saya menggunakan gunicorn, saya tidak dapat memilih apa yang harus dilewati)

Anda harus bisa lolos

location /cargo {
    rewrite ^/cargo(.*)$ $1 break;
    try_files $uri $uri/ /cargo/index.php?_REWRITE_COMMAND=$uri&args;
}
g3rv4
sumber
1

Bagi mereka yang mungkin kesulitan untuk menambahkannya untuk layanan mikro atau API dengan Node JS, saya menggunakan yang berikut ini untuk menghapus apidari url di server saya:

location ^~ /api {
        rewrite ^/api(/.*)$ $1 break;
        proxy_pass    http://127.0.0.1:3001/;
    }
George Mylonas
sumber