某件事告诉我,从一开始我做这件事的方式是错误的,这使我很难解决这个新问题……但是,我们走了!
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] / 目录中。仅此一项就花了我很多时间来弄清楚,但是现在我们有一个新的难题已经连续八小时将我踢倒了。
注意:正则表达式是我编程的弱点,因此此类东西的nginx配置基于正则表达式的事实使我丧命。
我需要能够检测到超出[project]级别的路径何时无法访问,然后使用路由参数将该请求重定向到项目级别的index.php,以便可以在php上进行处理级别。
例如:
http://site_url/dev/[user]/[project]/something/else/
如果目录 / opt / dev / [用户] / www / [项目] / something / else 不存在(或其中没有php文件),我需要请求到 / opt / dev / [用户] / www / [项目] /index.php ,但是我也想使用带有“路由”参数的index.php来提供其余的URL。
(即:index.php?route = something / else)
我希望这是有道理的,我也希望有人可以在这里为我提供帮助。 我承认这可能意味着完全更改我的配置,但是只要它可以工作,我就不在乎。
这是我从上到下的整个配置文件:
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 :(得分:1)
听起来像您要尝试的操作是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] / something / else的请求,如下所示:
首先尝试/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']
的值将为'/ something / else'
最后,如果这些工作均未返回404。