Назад | Перейти на главную страницу

Nginx - направляет все запросы в один скрипт

У меня есть сценарий PHP, который обрабатывает маршрутизацию сценария и делает всевозможные причудливые вещи. Изначально он был разработан для Apache, но я пытаюсь перенести его на nginx для некоторых из своих ящиков. Прямо сейчас я пытаюсь сгладить ситуацию на тестовом сервере.

Таким образом, сценарий работает так, что он перехватывает весь HTTP-трафик для каталога (в Apache), используя .htaccess файл. Вот как это выглядит:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

Довольно просто. Все запросы проходят через index.php, легко и просто.

Я хочу имитировать это поведение на nginx, но я еще не нашел способа. У кого-нибудь есть предложения?

Вот копия моего nginx.conf файл на данный момент. Обратите внимание, что он был разработан для меня, чтобы просто попытаться заставить его работать; в основном это копирование / вставка.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

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

Добавь это,

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

Что он делает, так это сначала проверяет наличие $ uri и $ uri / как реальных файлов / папок, и, если они не существуют, просто проходит через /index.php (это моя настройка для Zend framework, где маршрутизация выполняется через индекс .php) - конечно, если вам нужно передать некоторые параметры, просто добавьте к /index.php a? q = в конце, и он передаст параметры.

Убедитесь, что директива try_file доступна начиная с версии 0.7.27 и выше.

Разобрался сам! Да!

Все, что мне нужно для location блок был:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

Все остальное осталось в основном прежним.

Чтобы сохранить аргументы GET, используйте следующее:

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

$ is_args преобразуется в '?' если $ args не пуст

Или еще проще:

location / {
    try_files /index.php$is_args$args;
}

После установки корневого каталога добавьте это

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

В соответствии с вашими потребностями вы можете изменить регулярное выражение, поскольку вам нужно установить query_string на index.php

Одна очень важная ошибка, которую следует избегать, когда вашей целью является файл PHP, - убедиться, что все return / rewrite правило, которое вы используете, не отменяет location ~ \.php директива. Если это произойдет, nginx будет обслуживать ваш PHP-файл без его рендеринга, показывая исходный код PHP. Это может быть катастрофой.

Самый безопасный способ уже предоставлен, location / { try_files $uri $uri/ /index.php; }

Убедитесь, что вы также установили index index.php в твоем location / заблокировать и раскомментировать location ~ \.php блок включен в файл конфигурации по умолчанию.