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

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

Настройка

    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 / [пользователь] / [проект] / работает нормально, если в каталоге проекта есть php-файлы, которые локально находятся в / Opt / DEV / [пользователь] / WWW / [проект] / каталог. Одно это заняло у меня совсем немного времени, чтобы понять, но теперь у нас есть новая дилемма, которая пинает меня в задницу уже 8 часов подряд.

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

Эта проблема

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

Например:

Http: // site_url / DEV / [пользователь] / [проект] / что-то / другое /

Если каталог / Opt / DEV / [пользователь] / WWW / [проект] / что-то / другое не существует (или в нем нет файлов 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;
}
}

0

Решение

Похоже, что вы пытаетесь сделать это 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 / [user] / www / [project] / что-то еще:

Первая попытка /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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]