nginx 重写请求以删除未知路径



我有一个应用程序在docker容器(webdevops/php-nginx(中运行,认为它运行在根路径,f.ex。

http://localhost:8000/index.php

在应用程序前面,我正在运行一个外部负载均衡器,并在同一主机上为每个应用程序提供单独的 URI 路径,例如:

http://localhost/app1/index.php should use the backendserver at http://localhost:8000

当请求进入我的应用程序时,它将 http://localhost:8000/app1/index.php,但我希望我的 nginx 剥离/app1/部分(第一个路径段(。我事先不会知道路径段的内容。

下表显示了一些示例:

+------------------------------------------------_+----------------------------+--------------+-----------------------+
|                  Incoming URL                   |         File tried         | File exists? |       File used       |
+------------------------------------------------_+----------------------------+--------------+-----------------------+
| http://localhost:8000/                          | /index.php                 | N            | /index.php            |
| http://localhost:8000/app1/                     | /app1/index.php            | N            | /index.php            |
| http://localhost:8000/css/base.css              | /css/base.css              | Y            | /css/base.css         |
| http://localhost:8000/app1/edit.php             | /app1/edit.php             | N            | /edit.php             |
| http://localhost:8000/app1/css/base.css         | /app1/css/base.css         | N            | /css/base.css         |
| http://localhost:8000/app1/foo/bar/css/base.css | /app1/foo/bar/css/base.css | N            | /foo/bar/css/base.css |
+------------------------------------------------_+----------------------------+--------------+-----------------------+

我尝试了以下配置:

/

opt/docker/etc/nginx/vhost.common.d/10-location-root.conf

location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/([^/]+/)(.*)$ {
try_files $uri $uri/ /$2 /index.php?$query_string;
/

opt/docker/etc/nginx/conf.d/10-php.conf

upstream php {
server 127.0.0.1:9000;
}
/

opt/docker/etc/nginx/vhost.common.d/10-php.conf

location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME     $request_filename;
fastcgi_read_timeout 600;
}

它适用于提供静态文件,但任何 PHP 文件提供的第二个位置语句都停止工作。

我确信有一个微不足道的解决方案,但我现在有点难倒了。

所以我找到了一个可能的解决方案,添加了第二个位置语句,它似乎可以做我想要的:

/

opt/docker/etc/nginx/vhost.common.d/10-location-root.conf

location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ ^/([^/]+)(/.*.php)$ {
fastcgi_split_path_info ^/(?:[^/]+)/(.+.php)(/.+)$;
fastcgi_pass php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME     $document_root$2;
fastcgi_read_timeout 600;
}
location ~ ^/([^/]+/)(.*)$ {
try_files $uri $uri/ /$2 /index.php?$query_string;

最新更新