Bagaimana cara kerja try_files?


72

Saya melihat dokumentasi nginx dan itu masih membingungkan saya.

Bagaimana cara try_fileskerjanya? Inilah yang dikatakan dalam dokumentasi:

Dari NginxHttpCoreModule

try_files

sintaks: try_files path1 [path2] uri

default: tidak ada

konteks: server, lokasi

ketersediaan: 0.7.27

Memeriksa keberadaan file secara berurutan, dan mengembalikan file pertama yang ditemukan. Garis miring menunjukkan direktori - $ uri /. Jika tidak ada file yang ditemukan, pengalihan internal ke parameter terakhir dipanggil. Parameter terakhir adalah URI cadangan dan harus ada, atau kesalahan internal akan dimunculkan. Tidak seperti penulisan ulang, $ args tidak secara otomatis disimpan jika fallback bukan lokasi yang ditentukan. Jika Anda perlu args dipertahankan, Anda harus melakukannya secara eksplisit:

Saya tidak mengerti bagaimana cara memeriksa lintasan dan bagaimana jika saya tidak ingin kesalahan internal tetapi apakah itu melanjutkan sisa lintasan sebagai upaya untuk menemukan file lain?

Jika saya ingin mencoba file dalam cache /path/app/cache/url/index.htmldan jika gagal mencoba /path/app/index.phpbagaimana saya menulisnya? Jika saya menulis:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

Saya punya index index.php index.html index.htm;. Ketika saya mengunjungi /urlname, ia akan mencoba memeriksa /path/app/cache/urlname/index.phpkemudian /path/app/cache/urlname/index.html? Jika kita mengabaikan semuanya setelah try_filesitu, apakah mungkin untuk try_filesmemeriksa folder cache? Saya telah mencoba dan gagal.

Jawaban:


64

try_files mencoba jalur literal yang Anda tentukan terkait dengan direktif root yang ditentukan dan menetapkan pointer file internal. Jika Anda menggunakan misalnya try_files /app/cache/ $uri @fallback;dengan index index.php index.html;maka akan menguji jalur dalam urutan ini:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

sebelum akhirnya dialihkan secara internal ke lokasi yang bernama @fallback. Anda juga dapat menggunakan file atau kode status ( =404) sebagai parameter terakhir Anda tetapi jika menggunakan file itu harus ada .

Anda harus mencatat bahwa try_files sendiri tidak akan mengeluarkan pengalihan internal untuk apa pun kecuali parameter terakhir. Berarti Anda tidak dapat melakukan hal berikut: try_files $uri /cache.php @fallback;karena itu akan menyebabkan nginx mengatur penunjuk file internal ke $ document_root / cache.php dan melayani, tetapi karena tidak ada pengalihan internal terjadi, lokasi tidak dievaluasi kembali dan dengan demikian akan dievaluasi kembali. disajikan sebagai teks biasa. (Alasan kerjanya dengan file PHP sebagai indeks adalah bahwa direktif indeks akan mengeluarkan pengalihan internal)


2
Itu JAUH lebih jelas. Terima kasih. Saya sedikit tidak yakin bagaimana nama lokasi bekerja. Jika @fallback memiliki baris untuk fastcgi php yang akan berfungsi sebagai file php daripada teks? Apakah fallback digunakan ketika semuanya sebelum gagal?

2
Lokasi bernama hanya identik secara fungsional dengan lokasi normal kecuali hanya dapat diakses melalui mekanisme internal seperti error_page dan try_files. Fallback di try_files hanya digunakan ketika tidak ada jalur yang ditentukan menghasilkan file yang valid. Anda masih memerlukan lokasi untuk menangkap \ .php $ URI karena jika tidak try_files akan memicu pada $ uri jika file ada dan menyajikannya sebagai teks biasa.
Martin Fjordvald

Terima kasih atas jawaban ini .. Saya masih memiliki pertanyaan di sini: Apakah try_files dieksekusi segera atau akankah lokasi bersarang dicoba sebelumnya?
Stphane

@Stphane Anda pindah ke perairan keruh di sini. Warisan dalam nginx adalah kompleks, berantakan dan sepenuhnya tidak konsisten. Saya harus meninjau catatan lama saya hanya untuk mengingat ini sehingga tidak ada jaminan, tetapi tampaknya untuk try_files, khususnya ketika berhadapan dengan lokasi bersarang saja, tidak akan mengeksekusi jika lokasi dalam cocok. Saya akan merekomendasikan mengujinya.
Martin Fjordvald

5

Berikut ini adalah penggunaan try_files yang mudah digunakan, sebagai pengalihan tanpa syarat ke lokasi yang ditentukan. Lokasi yang disebutkan secara efektif bertindak sebagai subrutin, menyimpan duplikasi kode. Ketika argumen pertama untuk try_files adalah "_" pengalihan mundur selalu diambil.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.