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 框架的主要内容,如果未能解决你的问题,请参考以下文章

Zend 框架与子域

设置 zend 框架时禁止 Wamp 403

Zend 框架有代码生成器吗?

如何在不安装 Zend 框架的情况下使用 Zend 库

Zend 框架包含路径

Zend 框架与 XAMPP 的集成