使用nginx和fastcgi捕获PHP 404错误

时间:2013-12-07 01:55:28

标签: php linux nginx http-status-code-404 config

我为客户端设置了一个基本服务器,并说客户端需要基于nginx(我通常会将apache用于基于PHP的服务器)

这是工作配置。

server {
    listen 80;
    server_name localhost;
    auth_basic "My web site";
    auth_basic_user_file "/usr/local/nginx/www_passwd";

    location ~ ^/(?:share|conf) {
        deny all;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~ /\.svn {
        deny all;
    }

    location / {
        root /var/www;
        index index.php index.html index.htm;
    }



    location ~ \.php$ {
        root "/var/www";
        fastcgi_pass unix:/etc/phpcgi/php-cgi.socket;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

这对大多数程序都很有效。 但是我无法捕获PHP 404错误,这对于模块来说是必需的。

该模块位于名为“extra_app”

的目录中

所以我尝试在上面的配置中添加它:

location ~ ^/extra_app/([a-zA-Z0-9\.])$ {
    error_page 404 = /var/www/extra_app/index.php;
    root /var/www/extra_app/;
    index index.php index.html index.htm;
}

我需要能够从/ extra_app /目录中的php文件请求中拦截404错误。 我已将此添加到上述配置的.php部分:

fastcgi_intercept_errors on;

这没有任何影响。 (是的,我重新启动了nginx服务!)

有没有人知道解决方案?

谢谢!

[编辑]

我不确定是否需要404错误页面...也许可以为nginx编写'mod_rewrite'规则?我是nginx的新手,我甚至不确定你是否可以重写网址......

1 个答案:

答案 0 :(得分:0)

可能导致问题的一件事是位置块的范围。错误页面指令位于一个位置块中,当发生错误时正在使用的php块位于另一个位置块中,因此它没有看到error_page指令。

您可以将error_page指令向上移动一级(但随后将捕获所有404错误,或构造php块的副本,但使用/ extra-app前缀。

   location ~ ^/extra_app/(.*\.php)$ {
        root "/var/www";
        error_page 404 /extra_app/404.php
        fastcgi_pass unix:/etc/phpcgi/php-cgi.socket;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

因为nginx将选择最长的前缀,这将优先于所有其他应用的较短前缀。