2013-11-01 21 views
13

Tôi muốn làm cho ứng dụng Zend Framework 2 chạy trong máy chủ Nginx. Tôi có thể truy cập trang chủ, nhưng tôi không thể truy cập bất kỳ mô-đun nào khác. Tôi thấy rằng Nginx cần một quy tắc viết lại để truy cập URL như tên miền/album. Câu hỏi đặt ra là làm cách nào để chuyển đổi các quy tắc mặc định .htaccess của Zend Framework 2 thành quy tắc viết lại Nginx?Làm thế nào để làm cho Zend Framework 2 hoạt động với nginx?

Sau đây là các quy tắc .htaccess:

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$ 
RewriteRule ^(.*) - [E=BASE:%1] 

RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L] 

Trả lời

19

Bạn thực sự không cần bất kỳ quy tắc viết lại để làm cho Nginx và ZF2 để chơi đẹp với nhau. Đây là cấu hình Nginx rất đơn giản mà tôi sử dụng:

server { 
    listen *:80; 
    server_name DOMAIN; 

    # Character Set 
    charset utf-8; 

    # Logs 
    access_log /vhosts/DOMAIN/logs/access_log main; 
    error_log /vhosts/DOMAIN/logs/error_log; 

    # Directory Indexes 
    index index.php; 

    # Document Root 
    root /vhosts/DOMAIN/public; 

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

    # Error Pages 
    error_page 404 /404.html; 
    error_page 500 502 503 504 /50x.html; 

    # PHP-FPM Support 
    location ~ \.php$ { 
     fastcgi_pass unix:/usr/local/etc/php-fpm/DOMAIN.sock; 
     include fastcgi.conf; 
    } 

    # Block access to .htaccess 
    location ~ \.htaccess { 
     deny all; 
    } 
} 

Tất nhiên thay đổi đường dẫn đến thiết lập hiện tại của bạn. Vì bạn không đề cập đến loại cài đặt PHP nào bạn đang sử dụng nên tôi không thể giúp bạn ở đó vì tôi hiện đang sử dụng PHP-FPM.

Sử dụng thiết lập rất đơn giản này tất cả các mô-đun của tôi đang hoạt động như mong đợi. Ví dụ tôi có thể truy cập http://example.com/some/url HOẶC http://example.com/index.php/some/url

Nginx cũng có một cấu hình đơn giản cho ZF http://wiki.nginx.org/Zend_Framework#Time_for_nginx

Sửa 1 - Thêm fastcgi_params cấu hình

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
fastcgi_param QUERY_STRING  $query_string; 
fastcgi_param REQUEST_METHOD  $request_method; 
fastcgi_param CONTENT_TYPE  $content_type; 
fastcgi_param CONTENT_LENGTH  $content_length; 

fastcgi_param SCRIPT_NAME  $fastcgi_script_name; 
fastcgi_param REQUEST_URI  $request_uri; 
fastcgi_param DOCUMENT_URI  $document_uri; 
fastcgi_param DOCUMENT_ROOT  $document_root; 
fastcgi_param SERVER_PROTOCOL $server_protocol; 
fastcgi_param HTTPS    $https if_not_empty; 

fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR  $remote_addr; 
fastcgi_param REMOTE_PORT  $remote_port; 
fastcgi_param SERVER_ADDR  $server_addr; 
fastcgi_param SERVER_PORT  $server_port; 
fastcgi_param SERVER_NAME  $server_name; 

# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS 200; 
+0

Wow! Nó thực sự giúp tôi truy cập các mô-đun khác! Cảm ơn nhiều! –

+0

Bạn đã định cấu hình "fastcgi_param SCRIPT_FILENAME" của mình như thế nào? I có ab Vấn đề ở đó chỉ có tác phẩm này: "fastcgi_param SCRIPT_FILENAME $ document_root/index.php;" và bây giờ không thể định tuyến bất kỳ tuyến "miền/[bất kỳ]/index.php" nào? – Gizzmo

+0

@Gizzmo theo yêu cầu, tôi đã cập nhật câu trả lời để cung cấp thông tin bạn đã yêu cầu. – Diemuzi

9

Để theo dõi về câu trả lời của Diemuzi.

Xin nhớ rằng, nếu bạn muốn tham số truy vấn được làm việc trong ứng dụng của bạn, bạn phải vượt qua họ cùng với try_files

Cách tốt nhất tôi tìm thấy là sử dụng cả hai $is_args$args. $is_args chỉ đặt dấu chấm hỏi nếu có đối số và $args chuyển đối số truy vấn.

Thay

try_files $uri $uri/ /index.php;

với

try_files $uri $uri/ /index.php$is_args$args;

Bây giờ bạn có thể sử dụng truy vấn params như bình thường trong ứng dụng ZF2 của bạn ví dụ như trong một bộ điều khiển mặc định

$query_params = $this->params()->fromQuery();

Các vấn đề liên quan