nginx 上的 Zend 框架
Posted
技术标签:
【中文标题】nginx 上的 Zend 框架【英文标题】:Zend Framework on nginx 【发布时间】:2010-09-27 11:09:01 【问题描述】:我一直在开发的基于 Zend Framework 的站点现在正在迁移到其生产服务器。这个服务器原来是 nginx(惊喜!)。由于它是在 Apache 上开发的并且依赖于 htaccess 文件,因此该站点自然无法正常工作。
我的问题是……有人有这方面的经验吗?关于如何将 htaccess 文件的功能转换为 nginx.conf 文件的任何想法?我正在研究这个,但我希望有人已经有这方面的经验。谢谢!
编辑:这是当前的 htaccess:
RewriteEngine On
RewriteCond %REQUEST_FILENAME -s [OR]
RewriteCond %REQUEST_FILENAME -l [OR]
RewriteCond %REQUEST_FILENAME -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ /index.php [NC,L]
【问题讨论】:
你的 .htaccess 中有什么? @gaoshan88 如果stunti回答了,为什么不接受他的回答,或者还有什么可以帮助你的吗? 因为当时我还没有机会真正测试 stunti 的建议。 也相关:serverfault.com/questions/24243/… 【参考方案1】:server
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
error_log /var/log/nginx/localhost.error.log;
root /var/www/localhost/public;
try_files $uri @php_index;
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location @php_index
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /var/www/localhost/index.php;
include fastcgi_params;
建议尽可能使用 try_files。
【讨论】:
在 Nginx 网站上有 try_files + PHP 的例子:wiki.nginx.org/HttpCoreModule#try_files 这个解决方案对我来说比接受的答案更好。使用接受的答案版本,没有 POST 数据被传递给 PHP,可能是由于使用了错误页面。使用此解决方案,一切都按预期工作。 多年后……这确实更好。请注意,这个答案是在提出问题 2 年后才出现的,这就是为什么它没有被接受,仅供参考。【参考方案2】:我知道这是一个很老的帖子,但无论如何它可能会对某些人有所帮助。
基本上它将任何 404 错误重定向到 index.php,但如果文件存在(类型文件)它将设置正确的根。
我是从头顶上做的。它可能无法立即工作,您必须放置正确的路径和 fastcgi 配置。我还将所有内容都放回 index.php,因为它应该像 Zend_Framework 那样工作
error_page 404 = /index.php;
location /
if (-f $request_filename)
root /var/www;
location ~ \.php$
fastcgi_pass unix:/tmp/php.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/index.php;
include /etc/nginx/fastcgi_params;
【讨论】:
我认为这不是一个有效的解决方案,因为如果出现 404 错误,您将可以正常提供页面,但在标题响应中您会看到 404 状态代码,所以它会搞砸与您的搜索引擎优化,对吧? @anders。你是对的,我已经相应地改变了这个例子。在此处查看文档。 wiki.nginx.org/HttpCoreModule#error_page我现在做的不一样。 php的全部位置和资产的特定位置(图像,css,js,html,...) -f (Nginx) 检查文件是否存在。它与 Apache 语法不同:-s(常规文件)或 -l(符号链接)或 -d(目录)。正确的等价物是-e。并且应该使用 try_files 而不是 if。 显然,在location
中使用If
是不好的做法,应尽可能避免:wiki.nginx.org/IfIsEvil。这适用于 Drupal
(wiki.nginx.org/Drupal),但应与 ZF
一起使用,只需稍作更改。【参考方案3】:
我不知道转换 htaccess 文件的任何自动/系统方法,您可能必须手动进行。 Nginx wiki 是 nginx 文档的最佳资源。
编辑: 我现在自己在 Nginx 上运行 Zend Framework,配置如下所示:
server
listen 80;
server_name servername.com;
root /var/www/zendapp/public;
location /
index index.php;
# Deny access to sensitive files.
location ~ (\.inc\.php|\.tpl|\.sql|\.tpl\.php|\.db)$
deny all;
location ~ \.htaccess
deny all;
# Rewrite rule adapted from zendapp/public/.htaccess
if (!-e $request_filename)
rewrite ^.*$ /index.php last;
# PHP scripts will be forwarded to fastcgi processess.
# Remember that the `fastcgi_pass` directive must specify the same
# port on which `spawn-fcgi` runs.
location ~ \.php$
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
location = /50x.html
root /var/www/default;
如您所见,重写规则本身非常简单。
【讨论】:
【参考方案4】:这是“官方的”,简单又好用:
http://wiki.nginx.org/Zend_Framework#Time_for_nginx
【讨论】:
它丢失了 GET 参数...看看kfalck.net/2011/06/19/fix-empty-nginx-fastcgi-query-strings【参考方案5】:对于可以提供帮助的登台服务器 ;)
fastcgi_param APPLICATION_ENV staging;
【讨论】:
【参考方案6】:实际上我用一个像zend框架一样工作的drupal站点运行一个nginx:一个index.php作为引导程序
这是规则(未在 zend 框架上测试,仅在 drupal 上测试,但应该类似)
location /
if (!-e $request_filename)
rewrite ^/(.*)$ /index.php?q=$1 last;
break;
error_page 404 /index.php;
【讨论】:
这是 nginx 中许多应用程序的基本规则,例如 Drupal。好!【参考方案7】:如果您为您的项目使用子目录,例如http://some.url/myproject/controller/,那么您还需要将 setBaseUrl 添加到您的引导文件中。
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
protected function _initSomeFancyName()
$this->bootstrap('frontController');
$frontController = Zend_Controller_Front::getInstance();
$frontController->setBaseUrl('/myproject'); // set the base url!
nginx 重写如下所示:
location /myproject/
if (!-e $request_filename)
rewrite ^/myproject/(.*)$ /index.php?$1? last;
PS 问号不是错字!
【讨论】:
【参考方案8】:如果可能的话,我建议他们在只能从 Nginx 机器访问的非标准端口上设置 Apache,并让 Nginx 代理到 Apache。
Nginx Proxy documentation
【讨论】:
等等……什么?除非您有一些 非常 Apache 特定的要求(并且重写规则不是 Apache 特定的),否则这个建议是疯狂的。 希望 nginx 服务于轻量级静态内容并让 apache 处理应用程序逻辑并非没有道理。以上是关于nginx 上的 Zend 框架的主要内容,如果未能解决你的问题,请参考以下文章