Nginx 配置 - 在非常自定义的设置中将路由传递给 index.php

Nginx Configuration - Passing route to index.php on a very custom setup

有些事情告诉我,我从一开始就采用的方法是错误的,这让我很难解决这个新问题...但是我们开始吧!

设置

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

            # PHP location check for personal dev environments
            location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME $document_root;
                    fastcgi_param PHP_VALUE error_log=/opt/dev//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 个小时让我烦恼了。

注意:正则表达式是我在编程方面的弱点,所以 nginx 配置这些东西是基于正则表达式的事实让我很伤心

问题

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

例如:

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

如果目录/opt/dev/[用户]/www/[项目]/something/else不存在(或者没有php文件),我需要去 /opt/dev/[user]/www/[project]/index.php 的请求,但我也想打电话index.php 带有一个 "route" 参数,它给出 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//www/;
            autoindex on;

            # PHP location check for personal dev environments
            location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {                
                    include snippets/fastcgi-php.conf;
                    fastcgi_param SCRIPT_FILENAME $document_root;
                    fastcgi_param PHP_VALUE error_log=/opt/dev//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 如果文件存在则提供文件,如果不存在则尝试下一个。这样的事情应该可行,我正在使用第三个正则表达式块来捕获您的路由变量,我将其传递给 headers.

location ~ ^/dev/(\w+)\/((?1))(.*) {
    root /opt;
    autoindex on;
    add_header x-route ;
    try_files  /dev//www//index.php /dev//www/.php /dev//www// /dev//www//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”

最后,如果 none 这些工作 return 404。