nginx - 配置 nginx 多个位置不区分大小写
问题描述
我将我的 nginx 作为反向代理设置,如下所示:
server {
listen 80;
server_name mydomain.com anotherdomain.es 20.18.4.140;
location ^~ /service/ {
proxy_pass http://20.18.4.146/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /vm2/ {
proxy_pass http://20.18.4.146/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /vm3/ {
proxy_pass http://20.18.4.142:6001/;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
} location / {
proxy_pass http://20.18.4.148/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
} }
server {
listen 443 ssl;
server_name mydomain.com anotherdomain.es 20.18.4.140;
fastcgi_param HTTPS on;
include /etc/nginx/include/ssl;
location ^~ /service/ {
proxy_pass https://20.18.4.146/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /vm2/ {
proxy_pass https://20.18.4.146/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /vm3/ {
proxy_pass https://20.18.4.142:6000/;
#proxy_set_header Host $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass https://20.18.4.148/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
现在我以这种方式正确访问它:
mydomain.com/service/...另一个域.es/service/...
mydomain.com/vm2/...另一个域.es/vm2/...
mydomain.com/vm3/...另一个域.es/vm3/...
mydomain.com/...另一个域名.es/...
将所有流量从某个位置重定向到适当的服务器。url 的其余部分(包括参数)没有问题,并且有大写和小写。
但我需要这些位置不区分大小写。并且能够像这样(或任何其他组合)访问它:
mydomain.com/Service/...另一个域.es/SERVICE/...
mydomain.com/VM2/...另一个域.es/Vm2/...
我不想重复位置或重复每个位置的配置。我想做得更好,更有效率。
我尝试过使用正则表达式,但检查语法会给我带来错误并且它不起作用。比如这个:
~* ^/(vm2|Vm2|VM2)/$
~* ^/vm2/
~* /(<vm2>/g)
~* /app1/(.*)
...
错误:
nginx:[emerg]“proxy_pass”不能在正则表达式给出的位置、命名位置、“if”语句或/etc/nginx/sites-enabled/my-sites中的“limit_except”块中包含URI部分:4 nginx:配置文件 /etc/nginx/nginx.conf 测试失败
也可能是这种情况:mydomain.com/vm2/service/15(作为正则表达式,它将是 2)
我已经看过并尝试了很多,但我没有看到任何适合我的东西。有任何想法吗?谢谢。
解决方案
根据Richard Smith的线索,我所看到的和新的读数(nginx-case-insensitive-location)我把它留在了那里:
location ~* /service(?<stuff>.*)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^ /$stuff break;
proxy_pass http://20.18.4.146;
}
...
...ssl
...
location ~* /service(?<stuff>.*)$ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^ /$stuff break;
proxy_pass https://20.18.4.146;
}
...
location / {
proxy_pass https://20.18.4.148/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
现在“服务”或“vmX”带有区分大小写,表示服务或服务或服务或 VM2。
我希望它可以帮助像我这样的其他 nginx 没有经验的人。
推荐阅读
- python-3.x - Jupyter Notebook 在虚拟环境中找不到已安装的软件包
- azureml - 尝试获取工作区时出现“解析失败”错误
- javascript - 通过 xpath 传递的字符串变量未定位元素并引发异常
- sql - 根据开始日期和结束日期将日期分成季度
- node.js - 我需要删除“i”标签后的电话号码
- arm - 相当于clang中的-mno-sched-prolog?
- java - 如何使用注释测试依赖注入?
- c - 为什么整数指针会自动变为 0x384
- python - 在 Jupyter Notebook 中的 pymc3 - 模型未“重置”
- unix - 如何使用 awk 将两种不同类型的 csv 文件重新格式化为一种通用格式?