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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.