2013-11-01 44 views
13

我想讓Zend Framework 2應用程序在Nginx服務器中運行。我可以訪問主頁,但我無法訪問任何其他模塊。我發現Nginx需要重寫規則才能訪問域名/相冊等URL。問題是如何將默認的Zend Framework 2的.htaccess規則轉換爲Nginx重寫規則?如何使Zend Framework 2與nginx一起工作?

這裏是.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] 

回答

19

你真的不需要任何重寫規則作出的Nginx和ZF2發揮好起來。這裏是我使用的一個非常簡單的Nginx配置:

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

當然要改變你當前設置的路徑。由於您沒有提及您使用的是什麼類型的PHP安裝,因此我無法爲您提供幫助,因爲我目前正在使用PHP-FPM。

使用這個非常簡單的設置,我所有的模塊都按預期工作。例如,我可以訪問http://example.com/some/url OR http://example.com/index.php/some/url

的Nginx也有ZF http://wiki.nginx.org/Zend_Framework#Time_for_nginx

簡單的配置編輯1 - 增加fastcgi_params配置

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

哇!它確實幫助我訪問其他模塊!非常感謝你! –

+0

你是如何配置你的「fastcgi_param SCRIPT_FILENAME」我有ab的問題只有這個工作cuz:「fastcgi_param SCRIPT_FILENAME $ document_root/index.php;」現在任何路由「域/ [任何事物] /index.php」不能被路由? – Gizzmo

+0

@Gizzmo根據要求,我已經更新了答案,以提供您所要求的信息。 – Diemuzi

9

要跟進Diemuzi的答案。

請記住,如果你想查詢參數在應用程序中工作,你必須通過他們,我發現try_files

最好的辦法是沿着同時使用$is_args$args。如果有參數,$is_args只設置一個問號,並且$args傳遞查詢參數。

更換

try_files $uri $uri/ /index.php;

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

現在你可以使用查詢在默認控制器通常PARAMS在例如你ZF2應用

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