Nginx wildcard / regex di jalur lokasi

22

Konfigurasi Nginx yang telah saya lempar 404 untuk .phpseperti:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

Namun saya memiliki beberapa file index.php dalam subfolder yang ingin saya jalankan. Konfigurasi saat ini seperti:

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

ini berfungsi dengan baik, tetapi masalahnya adalah duplikat lokasi dan jika ada banyak subhalaman maka konfigurasi menjadi besar.

Saya mencoba wildcard seperti * dan beberapa regex, yang mengatakan tes nginx lulus tetapi tidak memuat halaman yaitu 404. Apa yang saya coba adalah:

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

Apakah ada cara saya dapat memiliki beberapa pathname di lokasi sebagai regex atau wildcard?


sumber

Jawaban:

32

The =pengubah di locationblok yang sama persis, tanpa wildcard, pencocokan awalan atau ekspresi reguler. Itu sebabnya itu tidak berhasil.

Pada upaya regex Anda, [a-z]cocok dengan satu karakter antara adan z. Itu sebabnya itu tidak berhasil untuk Anda.

Anda perlu mengatur lokasi Anda seperti berikut ini. Perhatikan urutan locationpernyataan. nginx memilih kondisi regex yang cocok pertama.

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

Saya menggunakan pencocokan peka huruf besar-kecil di sini ( ~bukan pengubah ~*). Dalam kasus pertama, saya mencocokkan bagian pertama jalur, lalu satu atau lebih jumlah karakter alfabet / angka dan kemudian index.php. Anda dapat memodifikasi rentang pertandingan, tetapi ingat +untuk pengulangan "satu atau lebih".

Yang kedua cocok dengan URI yang berakhir dengan .php. Anda tidak memerlukan karakter tambahan di versi karena cara ekspresi reguler berfungsi.

Tero Kilkanen
sumber
terima kasih, ya pengulangan hal utama hilang dari regex. +memperbaikinya.
1

Urutan penting, dari deskripsi "lokasi" nginx :

Untuk menemukan lokasi yang cocok dengan permintaan yang diberikan, nginx pertama-tama memeriksa lokasi yang ditentukan menggunakan string awalan (lokasi awalan). Di antara mereka, lokasi dengan awalan pencocokan terpanjang dipilih dan diingat. Kemudian ekspresi reguler diperiksa, sesuai urutan kemunculannya di file konfigurasi. Pencarian ekspresi reguler berakhir pada kecocokan pertama, dan konfigurasi yang sesuai digunakan. Jika tidak ditemukan kecocokan dengan ekspresi reguler maka konfigurasi lokasi awalan yang diingat sebelumnya digunakan.

Itu berarti:

  • Pertama =. ("awalan pencocokan terlama" cocok)
  • Maka yang tersirat. ("awalan pencocokan terlama" cocok)
  • Kemudian regex. (pertandingan pertama)

Anda perlu menyesuaikan urutan bagian regex.

Gea-Suan Lin
sumber