Nginx配置-通过非常自定义的设置将路由传递到index.php

时间:2018-08-25 15:19:38

标签: php nginx sysadmin

某件事告诉我,从一开始我做这件事的方式是错误的,这使我很难解决这个新问题……但是,我们走了!

设置

    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;
    }
}

1 个答案:

答案 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。