Как переписать, если файл не найден с помощью NGINX

Я использую NGINX на сервере Ubuntu. У меня есть этот виртуальный хост:

server {
        listen        80;
        server_name   *.example.com;
        root          /home/nginx/vhosts/example.com/web;

        location / {
                index     index.php;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9001;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        /etc/nginx/fastcgi_params;
        }
}

надо добавить правило...

Если файл/каталог НЕ НАЙДЕН, используйте index.php

Как я могу изменить директиву server {}?

Спасибо!


person Dail    schedule 07.05.2011    source источник


Ответы (4)


Вы можете использовать директиву try_files:

try_files $uri $uri/ /index.php

Сначала он попытается найти файлы и каталоги, и если это не сработает, он будет использовать index.php.

См. также раздел фронт-контроллер на вики-странице nginx.

person Ikke    schedule 07.05.2011
comment
лучше использовать try_files или переписать? (что быстрее) - person Dail; 07.05.2011
comment
try_files специально делает то, что вы хотите, поэтому я говорю, что это лучше. - person Ikke; 07.05.2011
comment
в зависимости от proxy_params я обычно получаю: 224616#0: *96676 цикл перезаписи или внутреннего перенаправления при внутреннем перенаправлении на /etc/nginx/proxy_params, client... use: if (!-e $request_filename){ rewrite ^(. *) $ /index.php последний; } - person ppostma1; 13.09.2013

Икке прав, используйте try_files так:

location / {
    try_files $uri $uri/ /index.php;
}

Но ваше местоположение PHP fastcgi небезопасно. См. эту статью, чтобы узнать больше об этом.

Для вашей установки вам нужно иметь что-то вроде этого:

location ~ \.php$ {
    try_files $uri /index.php;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    include /etc/nginx/fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass 127.0.0.1:9001;
}

Обратите внимание, что вы должны установить локальный fastcgi_param после включения глобальной конфигурации fastcgi_params.

person Sam Bauers    schedule 23.03.2015

Вам нужно настроить поток:

server {
    listen        80;
    server_name   *.example.com;
    root          /home/nginx/vhosts/example.com/web;

    location / {
            index     index.php;
    }

    location ~ \.php$ {
            root /home/nginx/vhosts/example.com/web;
            fastcgi_pass   127.0.0.1:9001;
            fastcgi_index index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
    }
}

надеюсь помочь вам

person zigo928    schedule 31.03.2012

У меня была такая же проблема на RH6 и EC2, и я исправил ее, жестко запрограммировав $document_root в параметре fastcgi_param. Надеюсь, это помогло.

person rebe100x    schedule 05.12.2012