如何使 Zend Framework 2 与 nginx 一起工作?
Posted
技术标签:
【中文标题】如何使 Zend Framework 2 与 nginx 一起工作?【英文标题】:How to make Zend Framework 2 work with nginx? 【发布时间】:2013-11-12 22:28:58 【问题描述】:我想让 Zend Framework 2 应用程序在 nginx 服务器中运行。我可以访问主页,但我无法访问任何其他模块。我发现Nginx需要重写规则才能访问域/专辑等URL。问题是如何将 Zend Framework 2 默认的.htaccess
规则转换为 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:BASEindex.php [NC,L]
【问题讨论】:
【参考方案1】:你真的不需要任何重写规则来让 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 或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;
【讨论】:
哇!它真的可以帮助我访问其他模块!非常感谢! 你是如何配置你的“fastcgi_param SCRIPT_FILENAME”的问题,因为只有这个有效:“fastcgi_param SCRIPT_FILENAME $document_root/index.php;”现在无法路由任何路由“domain/[anything]/index.php”? @Gizzmo 根据要求,我已更新答案以提供您所要求的信息。 在我的 fastcgi_params 中缺少配置的第一行。经过两天的挖掘,添加了它,现在一切正常)谢谢!【参考方案2】:跟进蝶木子的回答。
请记住,如果您希望查询参数在您的应用程序中工作,您必须将它们与try_files
一起传递
我发现最好的方法是同时使用$is_args
和$args
。 $is_args
如果有参数只设置一个问号,$args
传递查询参数。
替换
try_files $uri $uri/ /index.php;
与
try_files $uri $uri/ /index.php$is_args$args;
现在您可以像往常一样在 ZF2 应用程序中使用查询参数,例如在默认控制器中
$query_params = $this->params()->fromQuery();
【讨论】:
以上是关于如何使 Zend Framework 2 与 nginx 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
Xampp / Composer / Zend Framework 2 安装问题
如何避免与 Doctrine2 和 Zend Framework 2 的多对多关系重复?
如何在Zend Framework 2中访问路由,发布,获取等参数
是否可以将 Doctrine 2 与 Zend Framework 1.1x 集成?