Конфигурация Nginx - Передача маршрута в index.php с очень индивидуальной настройкой - PullRequest
0 голосов
/ 25 августа 2018

Что-то мне подсказывает, что то, как я пошел по этому пути с самого начала, неверно, что мешает мне решить эту новую проблему ... Но вот мы!

Настройка

    location ~ ^/dev/([^\/]+?)\/(.*) {
            alias /opt/dev/$1/www/$2;
            autoindex on;

            # PHP location check for personal dev environments
            location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME $document_root$3;
                    fastcgi_param PHP_VALUE error_log=/opt/dev/$1/logs/php_errors.log;
                    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            }
    }

Эта настройка выше позволяет моим разработчикам иметь собственную среду разработки. Переход к: http://site_url/dev/[user]/[project]/ работает просто отлично, если в каталоге проекта есть php-файлы, которые локально находятся в каталоге / opt / dev / [user] / www / [project] /, Одно это заняло у меня совсем немного времени, чтобы выяснить это, но теперь у нас есть новая дилемма, которая бьет меня по заднице уже 8 часов подряд.

Примечание: Regex - моя слабость в программировании, поэтому тот факт, что конфигурация nginx для таких вещей основана на регулярных выражениях, убивает меня мягко

Проблема

Мне нужно уметь обнаруживать, когда путь за уровнем [project] недоступен, и затем перенаправлять этот запрос в index.php на уровне проекта, с параметром route, чтобы мы могли обработать его на php уровень.

Например:

http://site_url/dev/[user]/[project]/something/else/

Если каталог / opt / dev / [user] / www / [project] / что-то / else не существует (или в нем нет файлов php), мне нужен запрос, чтобы перейти к / opt / dev / [user] / www / [project] /index.php, но я также хочу вызвать index.php с параметром «route», который дает остальную часть URL.

(то есть: index.php? Route = что-то / еще)

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

Полный источник

Это весь мой файл конфигурации сверху вниз:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www;

    index index.php index.html index.htm index.nginx-debian.html;

    server_name 192.168.20.200;

    location / {
            try_files $uri $uri/ =404;
    }

    location ~ ^/dev/([^\/]+?)\/(.*) {
            alias /opt/dev/$1/www/$2;
            autoindex on;

            # PHP location check for personal dev environments
            location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {                
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME $document_root$3;
                    fastcgi_param PHP_VALUE error_log=/opt/dev/$1/logs/php_errors.log;
                    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            }
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    location ~ /\.ht {
            deny all;
    }
}

1 Ответ

0 голосов
/ 26 августа 2018

Похоже, то, что вы пытаетесь сделать, это try_files Служите файлу, если он существует, попробуйте следующий, если его нет.Нечто подобное должно работать, я использую третий блок регулярных выражений для захвата вашей переменной маршрута, которую я передаю в заголовках.

location ~ ^/dev/(\w+)\/((?1))(.*) {
    root /opt;
    autoindex on;
    add_header x-route $3;
    try_files  /dev/$1/www/$2$3/index.php /dev/$1/www/$2$3.php /dev/$1/www/$2$3/ /dev/$1/www/$2/index.php =404;

Теперь Nginx попытается обработать ваш запрос на / dev /[пользователь] / www / [проект] / что-то вроде этого:

Первая попытка /opt/dev/[user]/www/[project]/something/else/index.php

Следующая попытка /opt/dev/[user]/www/[project]/something/else.php

Следующая попытка показать индексиз /opt/dev/[user]/www/[project]/something/else/

Далее попробуйте вернуться к /opt/dev/[user]/www/[project]/index.php В вашем PHP-скрипте значение $_SERVER['HTTP_X_ROUTE'] будет равно '/ что-то / еще'

Наконец, если ничего из этого не сработаетвозврат 404.

...