Nginx - Định tuyến tất cả các yêu cầu tới tập lệnh đơn


11

Tôi có một tập lệnh PHP xử lý định tuyến tập lệnh và thực hiện tất cả các thứ ưa thích. Ban đầu nó được thiết kế cho Apache, nhưng tôi đang cố gắng di chuyển nó sang nginx cho một vài hộp của tôi. Ngay bây giờ, tôi đang cố gắng giải quyết mọi thứ trên máy chủ thử nghiệm.

Vì vậy, cách tập lệnh hoạt động là nó chặn tất cả lưu lượng HTTP cho thư mục (trong Apache) bằng một .htaccesstệp. Đây là những gì trông giống như:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

Khá đơn giản. Tất cả các yêu cầu được chạy qua index.php, đơn giản và đơn giản.

Tôi đang tìm cách bắt chước hành vi đó trên nginx, nhưng tôi chưa tìm được cách nào. Bất cứ ai có bất kỳ đề nghị?

Đây là một bản sao của nginx.conftập tin của tôi tại thời điểm này. Lưu ý rằng nó được thiết kế cho tôi để cố gắng làm cho nó hoạt động; chủ yếu là một công việc sao chép / dán.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

Câu trả lời:


13

Thêm điều này,

 location / {
                    try_files $uri $uri/ /index.php;
            }

Trước tiên, hãy kiểm tra sự tồn tại của $ uri và $ uri / như các tệp / thư mục thực và nếu chúng không tồn tại sẽ chỉ đi qua /index.php (đó là thiết lập của tôi cho khung Zend nơi việc định tuyến được thực hiện thông qua chỉ mục .php) - tất nhiên nếu bạn cần truyền một số tham số, chỉ cần thêm vào /index.php a? q = ở cuối và nó sẽ truyền các tham số.

Đảm bảo rằng lệnh try_file có sẵn từ phiên bản 0.7.27 trở đi.


7

Tôi tự tìm ra nó! Vâng!

Tất cả tôi cần cho locationkhối là:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

Mọi thứ khác vẫn giữ nguyên.


Bạn đã thử những gì tôi viết dưới đây? Ngoài ra, điều đó có nghĩa là tất cả các tệp tĩnh của bạn sẽ đi qua index.php - không chắc chắn bạn muốn điều đó.
Adam Benayoun

@Adam: yeah, tôi đã thử mã của bạn. Tôi muốn mọi thứ chạy qua index.php. Cảm ơn, mặc dù!
mattbasta

2

Để duy trì các đối số GET, sử dụng như sau:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_args trở thành '?' nếu $ args không trống

Hoặc thậm chí đơn giản hơn:

location / {
    try_files /index.php$is_args$args;
}

1

Sau khi thiết lập thư mục gốc, hãy thêm cái này

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

Theo nhu cầu của bạn, bạn có thể thay đổi regex vì bạn cần cai trị query_ chuỗi thành index.php


4
Có nhiều cách tốt hơn là ifhoàn thành những gì anh ấy yêu cầu. wiki.nginx.org/ IfIsEvil
Isius

0

Một cạm bẫy rất quan trọng cần cẩn thận khi mục tiêu của bạn là tệp PHP là đảm bảo bất cứ điều gì return/ rewritequy tắc bạn sử dụng không thay thế location ~ \.phpchỉ thị. Nếu điều này xảy ra, nginx sẽ phục vụ tệp PHP của bạn mà không hiển thị nó, tiết lộ mã nguồn PHP. Điều này có thể là thảm họa.

Cách an toàn nhất đã được cung cấp, location / { try_files $uri $uri/ /index.php; }

Hãy chắc chắn rằng bạn cũng đã đặt index index.phptrong location /khối của mình và bỏ ghi chú location ~ \.phpkhối có trong tệp cấu hình mặc định.

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.