求一个 nginx url 重写配置

2017-09-19 23:23:15 +08:00
 rootx

默认重写规则:


if (!-e $request_filename) {
	rewrite  ^(.*)$ /index.php?s=$1 last;
	break;
}

需求:

将如下 “ www.test.com/key/其他参数” 重写成 “ key.m.test.com/其他参数” 但最终“其他参数”还是要走"/index.php?s=$1"

已经写的(判断 www ):


if ($request_uri ~* '~^www\.[a-z0-9\-]+?\.[a-z]/(.*)/+') {
    //不知道该如何写
}

求助求助求助

2777 次点击
所在节点    NGINX
4 条回复
gstqc
2017-09-19 23:49:23 +08:00
你这已经是不同域名了
要么反代,要么 301 302 跳转
没有这种写法
lework
2017-09-20 09:27:24 +08:00
server {
listen 80;
server_name www.test.com;
location /key {
proxy_pass http://key.m.test.com/key$request_uri;
}
}
lework
2017-09-20 09:32:42 +08:00
```
server {
listen 80;
server_name 345;
location /key/(/.*) {
proxy_pass http://123/$1$is_args$args;
}
}
```
应该是这个
gotea456
2018-11-14 14:05:26 +08:00
这个问题是因为 proxy_pass 的用法不正确,这个指令的参数含有 url 或者不含 url,比如:
proxy_passhttp://127.0.0.1:8888/web-test/; 以及 proxy_passhttp://127.0.0.1:8888;
这两种写法,会导致发到上游的 url 与原始 url 大不一样!
拿问题中的 location ^~ /test/ {}这个配置,当参数含有 url 时(使用 proxy_passhttp://127.0.0.1:8888/web-test/;配置),比如请求是 /test/resource/1.jpg ,实际转发到上游的请求是 /web-test/resource/1.jpg ,它是把 location 匹配以外剩余的 URL 拼接到 proxy_pass 指定 URL 的后面。
而当 proxy_pass 指令的参数只有域名,不 含有 url 时(使用 proxy_passhttp://127.0.0.1:8888;配置),针对同样的请求 /test/resource/1.jpg ,实际转发到上游的请求 url 仍然是 /test/resource/1.jpg 。
因此一定要注意 proxy_pass 后面的参数是否包含 url,它会影响转发到上游请求中 url 是否变化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/392095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX