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

11

У меня есть сценарий 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;
                }
        }
}
mattbasta
источник

Ответы:

13

Добавь это,

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

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

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

Адам Бенаюн
источник
7

Я понял это самостоятельно! Да уж!

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

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

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

mattbasta
источник
Вы пробовали то, что я написал ниже? Также это означает, что все ваши статические файлы будут проходить через index.php - не уверен, что вы этого хотите.
Адам Бенаюн
@ Адам: да, я попробовал твой код. Я хотел, чтобы все работало через index.php. Спасибо хоть!
Маттбаста
2

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

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

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

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

location / {
    try_files /index.php$is_args$args;
}
Александр Гаврилюк
источник
1

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

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

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

Жандос Жандос Уланулы
источник
4
Есть лучшие способы, чем ifвыполнить то, что он просит. wiki.nginx.org/IfIsEvil
Исиус
0

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

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

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

Люк Млсна
источник