Rumah  >  Soal Jawab  >  teks badan

url-rewrite - Masalah slash selepas direktori nginx

Persekitaran: versi nginx ialah 1.2.6
Baru-baru ini, saya menghadapi masalah aneh semasa mengerjakan projek Kerana saya ingin mereka bentuk semula URL, saya menggunakan peraturan penulisan semula nginx berikut:

if (-f $request_filename/index.html){
  rewrite (.*) /index.html break;
}
if (-f $request_filename/index.php){
  rewrite (.*) /index.php;
}
if (!-f $request_filename){
  rewrite (.*) /index.php;
}

Peraturan penulisan semula ini telah biasa digunakan Saya tidak tahu jika ada apa-apa yang salah~ (sila beri saya nasihat)

Apabila saya tidak menggunakan peraturan ini, garis miring akan ditambahkan secara automatik apabila mengakses direktori sedia ada pada pelayan Pada masa ini, peraturan penulisan semula automatik nginx ini adalah perkara biasa dan tiada masalah.

Tetapi selepas saya menambah peraturan di atas, garis miring tidak akan ditambah secara automatik apabila mengakses folder yang sudah ada pada pelayan Selain itu, selepas ujian berulang, saya mendapati bahawa peraturan ke-2 dan ke-3 menyebabkan masalah:

.

1 Jika anda hanya memadamkan peraturan kedua, maka tidak kira sama ada folder anda wujud atau tidak, ia akan dikesan sebagai tidak wujud, dan tiada garis miring akan ditambah, dan ia akan terus memasuki peraturan ketiga, dan akhirnya sepadan dengan indeks. .php. Ia boleh dilihat bahawa pada masa ini, ia diproses oleh fail.

2 Jika peraturan kedua dipadamkan, peraturan ketiga menentukan fail -f 改为 -e, iaitu fail atau folder:

if (!-e $request_filename){
  rewrite (.*) /index.php;
}

Pada masa ini, masalah selesai Jika direktori itu wujud, garis miring akan ditambah secara automatik.

Saya sangat keliru, tolong beri saya nasihat, kenapa jadi begini?

Selain itu, disebabkan beberapa masalah asal projek, terdapat banyak peraturan penulisan semula disasarkan lain dalam peraturan ke-3, jadi saya tidak mahu memasukkan peraturan ke-3 apabila input adalah folder dan ia wujud Untuk dipadankan peraturan, walaupun impak prestasi tidak ketara.

给我你的怀抱给我你的怀抱2712 hari yang lalu740

membalas semua(2)saya akan balas

  • 大家讲道理

    大家讲道理2017-05-16 17:31:15

    Selepas banyak ujian, saya fikirkan sendiri.

    Tiada yang salah dengan ketiga-tiga peraturan ini, dan yang kedua tidak pelik seperti yang saya katakan sebelum ini.

    Pertama, nginx akan dipadankan mengikut peraturan yang ditetapkan pengguna Apabila laluan yang anda masukkan wujud dan tidak mengandungi garis miring pada penghujungnya,
    Memandangkan index.php wujud dalam folder saya, $request_filename/index.php匹配第二条规则成功,注意这里的/, dan kemudian lakukan pemadanan seterusnya. Dengan kata lain, selagi folder ini wujud dan terdapat index.html atau index.php dalam folder ini, ia akan sepadan dengan peraturan pertama atau kedua yang saya berikan di atas, tidak ada keraguan tentangnya.

    Jadi, jika anda ingin mengelakkan pemadanan selepas peraturan pertama atau kedua dan secara automatik menambah garis miring apabila folder wujud, penyelesaiannya ialah menambah penghakiman pada folder sebelum peraturan pertama:

    if (-d $request_filename){
       rewrite ^/(.*)([^/])$ // permanent;
    }

    Maksud peraturan ini ialah jika folder itu wujud dan tiada garis miring, ia akan secara automatik menambah garis miring dan melakukan lompatan 301, masalah selesai.

    balas
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 17:31:15

    Logik yang terakhir ialah jika syarat sebelumnya tidak dipenuhi, "jika laluan yang diakses bukan fail", ia secara automatik akan melompat ke /index.php.

    Cadangan: Sisipkan ayat -e sebelum item ketiga untuk menyemak sama ada ia adalah folder Jika ya, tambahkan garis miring dan putus.

    Tidak diuji, untuk rujukan sahaja.

    balas
    0
  • Batalbalas