Menulis ulang try_files nginx

8

Saya mencoba untuk mengubah penulisan ulang yang sangat sederhana dari versi nginx sebelumnya ke versi sekarang yang terlihat seperti di bawah ini:

location / {
   if ( !-f $request_filename ) {
     rewrite ^/([a-z]*)$ /index.php?action=$1;
     rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2;
   }
}

Sejauh ini saya sudah sampai. Halaman indeks muncul, tetapi halaman apa pun yang harus ditulis ulang seperti di atas, sebagai gantinya melemparkan 404:

server {

    listen 80 default;
    root /var/www;
    index index.php;
    server_name _;

    location / {
        try_files $uri $uri/ /index.php?action=$uri&item=$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Apa yang saya lakukan salah di sini?

Industri
sumber
Apa yang sebenarnya terjadi? Bagian dari masalahnya adalah $ uri dan $ args tidak dikodekan dengan benar.
Luke
404 dilemparkan File not found. jika saya menggunakan URI /pageatau/page/id
Industri
Apa yang terjadi ketika Anda berbuat adil try_files $uri $uri/ /index.php?
Luke
Index.php bekerja dengan baik, tetapi apa pun yang harus ditulis ulang berakhir pada 404-an
Industri
Coba try_files $uri $uri/ /index.php?$args. Anda harus bisa mendapatkan URL dengan $_SERVER['REQUEST_URI']. $ _GET seharusnya bekerja secara normal.
Luke

Jawaban:

9

Ini seharusnya bekerja:

location / { 
    try_files $uri $uri/ @rules; 
} 

location @rules { 
    rewrite ^/([a-z]*)$ /index.php?action=$1; 
    rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2; 
}

location /index.php { 
    fastcgi_pass 127.0.0.1:9000; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
}
Luke
sumber
Hmm. Dalam contoh pertama Anda, index.php akan memuat, tetapi semua file statis atau permintaan URI seperti /page1/itemakan mengembalikan index.php
Industri
Itu aneh. try_files harus membereskannya.
Luke
Mencoba contoh kedua juga. Masalah yang sama di sana
Industri
Saya menganggap try_files $uri $uri/bekerja dengan file statis?
Luke