Что-то мне подсказывает, что то, как я пошел по этому пути с самого начала, неверно, что мешает мне решить эту новую проблему … Но мы идем!
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;
}
}
Похоже, что вы пытаетесь сделать это 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.
Других решений пока нет …