Viết lại try_files của nginx


8

Tôi đang cố gắng chuyển đổi một bản viết lại rất đơn giản từ phiên bản nginx trước đó sang phiên bản hiện tại trông như dưới đây:

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

Đây là cách tôi đã nhận được. Trang chỉ mục hiển thị, nhưng bất kỳ trang nào cần được viết lại như trên, thay vào đó sẽ ném 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;
    }
}

Tôi làm gì sai ở đây?


Điều gì đang xảy ra chính xác? Một phần của vấn đề là $ uri và $ args không được mã hóa chính xác.
Lu-ca

404 bị ném File not found. nếu tôi sử dụng URI /pagehoặc/page/id
Công nghiệp

Điều gì xảy ra khi bạn làm chỉ try_files $uri $uri/ /index.php?
Lu-ca

Index.php hoạt động độc đáo, nhưng mọi thứ nên được viết lại đều kết thúc vào 404 '
Công nghiệp

Hãy thử try_files $uri $uri/ /index.php?$args. Bạn sẽ có thể nhận được URL với $_SERVER['REQUEST_URI']. $ _GET nên hoạt động bình thường.
Lu-ca

Câu trả lời:


9

Điều này sẽ làm việc:

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; 
}

Hừm. Trong ví dụ đầu tiên của bạn, index.php sẽ tải, nhưng bất kỳ tệp tĩnh hoặc yêu cầu URI nào như /page1/itemsẽ trả về index.php
Công nghiệp

Thật ki quặc. try_files nên quan tâm đến điều đó.
Lu-ca

Đã thử ví dụ thứ hai là tốt. Vấn đề tương tự ở đó
Công nghiệp

Tôi đang giả sử try_files $uri $uri/làm việc với các tệp tĩnh?
Lu-ca

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.