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;
                }
        }
}

Відповіді:


13

Додайте це,

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

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

Переконайтеся, що директива try_file доступна з версії 0.7.27 і далі.


Попередження: Це не буде працювати над URL-адресами, які закінчуються .php , наприклад, це буде працювати:, /doesNotExist.ph але це не буде працювати (отримає замість цього 404):/doesNotExist.php
hanshenrik

7

Я зрозумів це самостійно! Ага!

Все що мені було потрібно для locationблоку:

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

Все інше значною мірою залишилося колишнім.


Ви спробували те, що я написав нижче? Також це означає, що всі ваші статичні файли будуть проходити через index.php - не впевнений, що ви цього хочете.
Адам Бенаун

@Adam: Так, я спробував ваш код. Я хотів, щоб все пробігалося через index.php. Дякую, хоча!
mattbasta

2

Для збереження аргументів GET використовуйте наступне:

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

$ is_args стає "?" якщо $ аргументується не порожнім

Або ще простіше:

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

Попередження: Це не буде працювати над URL-адресами, які закінчуються .php , наприклад, це буде працювати:, /doesNotExist.ph але це не буде працювати (отримає замість цього 404):/doesNotExist.php
hanshenrik

1

Після встановлення кореневого режиму додайте це

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

Відповідно до ваших потреб, ви можете змінити регулярний вираз, оскільки вам потрібний правлячий query_string на 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блок, включений у конфігураційний файл за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.