Вопрос: 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;
                }
        }
}

10
2017-08-14 22:55


Источник




Ответы:


Добавь это,

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

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

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


13
2017-08-14 23:06





Я понял это сам! Да!

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

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

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


4
2017-08-16 07:59



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


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

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

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


1
2018-03-12 09:17



Есть лучшие способы, чем if чтобы выполнить то, что он просит. wiki.nginx.org/IfIsEvil - Isius


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

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

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


0
2017-07-30 22:39