我有一个应用程序在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;