Проблема с 404 и fastcgi

Igor Sysoev is at rambler-co.ru
Fri Aug 26 16:38:11 MSD 2005


On Fri, 26 Aug 2005, Igor Sysoev wrote:

> On Fri, 26 Aug 2005, Andrei Nigmatulin wrote:
>
>> Есть вот такая конфигурация:
>> 
>>    fastcgi_index index.phtml;
>>    fastcgi_redirect_errors on;
>> 
>>    server {
>>        listen  80;
>> 
>>        location / {
>>            root   html;
>>            index  index.html index.htm;
>>        }
>> 
>>        # serve php scripts
>>        location ~ (/$|\.phtml$|\.php$) {
>>            fastcgi_param   DOCUMENT_ROOT     $document_root;
>>            fastcgi_param   PATH_TRANSLATED 
>> $document_root/$fastcgi_script_name;
>>            fastcgi_param   SCRIPT_NAME       $fastcgi_script_name;
>>            fastcgi_param   QUERY_STRING      $query_string;
>>            fastcgi_param   SERVER_NAME       $server_name;
>>            fastcgi_param   REQUEST_URI       $request_uri;
>>            fastcgi_param   DOCUMENT_URI      $document_uri;
>>            fastcgi_param   REQUEST_METHOD    $request_method;
>>            fastcgi_pass 127.0.0.1:8002;
>>        }
>> 
>>        error_page 404 =200 /404.phtml ;
>>    }
>> 
>> Как видно, все запросы, которые заканчиваются на "/" обрабатываются через 
>> fastcgi (/index.phtml).
>> 
>> 1) при запросе /non-existent отрабатывает скрипт 404.phtml.
>> 2) при запросе /non-existent/ вижу сообщение "No input file specified". 
>> Хочется чтобы эти запросы тоже обрабатывались скриптом /404.phtml. Как это 
>> можно сделать ?
>
> По идее, должны. Можно прислать мне отлаочный лог запроса /non-existent/ ?

Судя по логу, дело вот в чём. Значение переменной $fastcgi_script_name
кэшируется после первого определения. Для запроса "/non-existent/"
$fastcgi_script_name равна /non-existent/index.phtml. На этот запрос
fastcgi возвращает 404. error_page перехватывает ошибку и делает опять
запрос к fastcgi. Но так как $fastcgi_script_name закэшировано, то
PATH_TRANSLATED опять будет равен .../non-existent/index.phtml и
fastcgi опять возврашает ошибку 404. Она уже не перенаправляется
на error_page, а отдаётся, как есть.

Чтобы избежать такой ситуации, нужно описать отдельный location для
/404.phtml и указать там

fastcgi_param   PATH_TRANSLATED  $document_root/404.phtml;
или
fastcgi_param   PATH_TRANSLATED  /path/to/fastcgi/404.phtml;


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list