Nginx配置-在非常定制的设置中将路由传递到index.php

Nginx配置-在非常定制的设置中将路由传递到index.php,php,nginx,sysadmin,Php,Nginx,Sysadmin,有些事情告诉我,我从一开始就采取的方式是错误的,这使得我很难解决这个新问题。。。但我们走了 设置 上述设置允许我的开发人员各自拥有自己的个人开发环境。转到:如果该项目目录中有php文件,则可以正常工作,该目录在本地将位于/opt/dev/[user]/www/[project]/目录中。单是这一点我就花了相当多的时间来弄明白,但现在我们有了一个新的难题,已经连续8个小时踢我的屁股了 注意:Regex是我编程的弱点,因此,nginx对这类东西的配置是基于Regex的,这让我非常头疼 问题 我需要能

有些事情告诉我,我从一开始就采取的方式是错误的,这使得我很难解决这个新问题。。。但我们走了

设置 上述设置允许我的开发人员各自拥有自己的个人开发环境。转到:如果该项目目录中有php文件,则可以正常工作,该目录在本地将位于/opt/dev/[user]/www/[project]/目录中。单是这一点我就花了相当多的时间来弄明白,但现在我们有了一个新的难题,已经连续8个小时踢我的屁股了

注意:Regex是我编程的弱点,因此,nginx对这类东西的配置是基于Regex的,这让我非常头疼

问题 我需要能够检测[project]级别以外的路径何时不可访问,然后使用route参数将该请求重定向到项目级别的index.php,以便我们可以在php级别处理它

例如:

如果目录/opt/dev/[user]/www/[project]/something/else不存在(或者其中没有php文件),我需要请求转到/opt/dev/[user]/www/[project]/index.php,但我还想用一个“route”参数调用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;
    }
}

听起来你要做的是
try\u files
提供文件(如果存在),如果没有,则尝试下一个。类似的东西应该可以工作,我正在使用第三个regex块来捕获您的路由变量,我正在将其传递到报头中

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/之类的请求:

首先尝试
/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脚本中,
$\u SERVER['HTTP\u X\u ROUTE']
的值将是'/something/else'


最后,如果这些工作都没有返回404

太棒了,非常感谢您的详细回复。。我明天去试一试。
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;