- Normalisasi terjadi sebelum satu pun location dikonsultasikan
- URI didekode dari persen, segmen
. dan .. diselesaikan, garis miring berulang dimampatkan, dan baru setelah itu sebuah location dipilih. %2F yang terdekode menjadi pemisah sungguhan dan ikut dalam penyelesaian itu, sehingga /a/b%2F..%2Fzz dicocokkan sebagai /a/zz. Tiga karakter terdekode menjadi pengecualian dan tetap literal: %25, %23, dan %3F — itu sebabnya /a%3Fx=1 punya tanda tanya di path-nya dan query string kosong. Di sini + bukan spasi; hanya %20 yang spasi. Traversal yang naik di atas root dan escape tidak valid sama-sama ditolak dengan 400 sebelum pencocokan dimulai.
- Panjang prefiks yang menentukan, bukan urutan di konfigurasi
- Setiap location prefiks yang cocok dibandingkan dan yang terpanjang menang, entah ia muncul paling awal atau paling akhir di berkas. Perbandingannya per karakter, bukan per segmen path, jadi
/static cocok dengan /staticfoo. Pemenangnya diingat, bukan langsung dipakai, karena fase regex masih bisa menganulirnya.
- ^~ menekan regex; ia tidak menaikkan prioritas
- Modifier ini hanya diperiksa pada prefiks yang sudah menang berdasarkan panjang. Kalau ada prefiks biasa yang lebih panjang yang juga cocok, prefiks itulah yang diingat dan fase regex berjalan seperti biasa — blok
^~ sama sekali tidak berpengaruh pada permintaan tersebut. Menaruh ^~ pada location bersarang tidak melindungi dari regex yang dideklarasikan di level luar, dan ia tidak pernah menekan regex yang bersarang di dalam bloknya sendiri.
- Regex berjalan sesuai urutan berkas dan kecocokan pertama mengakhiri pencarian
- nginx menyimpan location regex sesuai urutan penulisannya dan tidak mengurutkannya. Spesifisitas, panjang, dan penjangkaran tidak memengaruhi mana yang diuji lebih dulu, jadi pola presisi yang ditaruh di bawah pola luas adalah konfigurasi mati. Location regex yang cocok tetap ditelusuri ke dalam, sehingga location bersarang di dalamnya diperiksa sesudahnya.
- PCRE dan ECMAScript bukan bahasa yang sama
- nginx mengompilasi regex location dengan PCRE, tanpa mode UTF maupun multiline, jadi polanya bekerja pada byte dan
^ hanya berjangkar di awal URI. Satu perbedaan punya bobot keamanan: $ pada PCRE juga cocok tepat sebelum baris baru di akhir, sehingga URI yang berakhir dengan %0A tetap memenuhi \.php$ padahal mesin JavaScript akan menolaknya. Perilaku itu ditiru di sini dan dilaporkan, karena inilah cara yang sudah dikenal untuk menyelinap lewat aturan yang bersandar pada ekstensi berkas.