2013-12-07 2 views
1

Я создал основной сервер для клиента, и сказал клиенту нужно, чтобы это было основано на Nginx (я обычно использую Apache для серверов на базе PHP)Поймать PHP ошибки 404 с Nginx и FastCGI

Это рабочая конфигурация.

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

Мне нужно, чтобы иметь возможность перехватывать ошибки 404 из запросов PHP-файлов в/extra_app /. Я добавил это к .php секции выше конфигурации:

fastcgi_intercept_errors on; 

Этот hasnt имел никакого эффекта. (Да, я перезапустил службу nginx!)

Кто-нибудь знает о решении?

Спасибо!

[EDIT]

Я не уверен, если страница 404 ошибки нужна ... Может быть, «mod_rewrite» правила могут быть написаны для Nginx? Я новичок в nginx, я даже не уверен, что вы можете переписать URL-адреса ...

+1

Я думаю, что 'error_page' может просто понять это. Вы можете прочитать [оригинальный документ] (http: // nginx. орг/EN/документы/HTTP/ngx_http_core_module.html # error_page). – akawhy

ответ

0

Одна вещь, которая может вызвать проблемы, - это определение областей расположения. Директива страницы с ошибкой находится в одном блоке местоположения и блоке php, который используется, когда возникает ошибка, в другом блоке местоположения, поэтому он не видит директиву error_page.

Вы можете либо переместить директиву error_page до уровня (но тогда все 404 ошибки будут пойманы, или построить копию блока PHP, но с префиксом/экстра-приложения.

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 выберет самый длинный префикс, это будет соответствовать более коротким для всех ваших других приложений.

Смежные вопросы