因此,我们有一个 PHP 开发服务器,其中每个开发人员都有一个个人子域名,例如https://dev-abc.mysite.com与相应的 NGINX 配置。
开发人员将我们的仓库的一个分支检入如下文件夹中:
- /var/www/html/dev-abc/branch-X
- /var/www/html/dev-abc/branch-Y
- /var/www/html/dev-abc/branch-Z
URL 格式:
https://dev-abc.mysite.com/{BRANCH}/index.php/{MODULE}/{CLASS}/?event={EVENT}&otherParamX=Y
{MODULE} 是模块/中的文件夹
{CLASS} 是模块/{MODULE} 中的类文件
{EVENT} 是模块/{MODULE} 中类内的方法
分支的访问方式如下: https://dev-abc.mysite.com/branch-X/index.php/report/invoice
我们只是尝试将 URL 重写为:
https://dev-abc.mysite.com/branch-X/report/invoice/
对于其子域下的所有子目录。
NGINX 配置如下:
小路:
/etc/nginx/conf.d/dev-abc.conf
server {
server_tokens off;
listen 80;
autoindex off;
server_name dev-abc.mysite.com;
root /var/www/html/dev-a;
error_log /home/dev-abc/nginx-error.log notice;
include /etc/nginx/includes/dev_sandbox;
rewrite_log on;
}
注意:/etc/nginx/includes/dev_sandbox 包含很多有关标头和 CORS 的内容,因此除非需要,否则我不会发布它,因为它很长。
我尝试了以下方法:
尝试 1:
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
NGINX 抛出:^(.+.php)(/.+)" 与 "/index.php" 不匹配,浏览器中也出现“文件未找到”
尝试2:
location ~(.+)/(.+) {
try_files $uri $1/index.php/$2;
}
作品:
https://dev-abc.mysite.com/branch-X/report/
不起作用:
https://dev-abc.mysite.com/branch-X/report/invoice/
尝试3:
location ~(.+)/(.+)/(.+) {
try_files $uri $1/control.php/$2/$3;
}
作品:
https://dev-abc.mysite.com/branch-X/report/invoice/
不起作用:
https://dev-abc.mysite.com/branch-X/report/
抛出:
未找到“/var/www/html/dev-abc/branch-X/report/index.php”
答案1
重复运算符如*
和+
贪婪的。因此,第一次捕获(.+)/(.+)
将占用所有空间,直到最后的 /
(后面至少有一个字符)。因此你的第二次尝试是完全可以预料到的。
您可以改用惰性重复运算符,如*?
和+?
,例如:
location ~ (.+?)/(.+) { ... }
或者,您可以使用仅匹配不为 的字符的字符类/
(记住第一个字符始终是/
),例如:
location ~ (/[^/]+)/(.+) { ... }
虽然在这种情况下不是绝对必要的,但你或许应该添加锚点因为您只对匹配整个 URI 感兴趣,所以围绕表达式,例如:
location ~ ^(.+?)/(.+)$ { ... }
或者:
location ~ ^(/[^/]+)/(.+)$ { ... }
重要的提示
正则表达式位置块按顺序进行评估,直到找到匹配项。请确保您的location ^(.+.php)(/.+)
块按顺序首先出现,以避免重定向循环。
答案2
这最终为我工作:
location ~ ^(.+?)\/(.+)$ {
try_files $uri $1/index.php/$2;
}
作品:
https://dev-abc.mysite.com/branch-X/report/invoice/
->https://dev-abc.mysite.com/branch-X/index.php/report/invoice/
作品:
https://dev-abc.mysite.com/branch-X/report/
->https://dev-abc.mysite.com/branch-X/index.php/report/