我想将 位置 重定向play.example.com/u/<user id>
至example.com/u/<user id>
play.example.com/b/<game id>
play.example2.net/b/<game id>
同时也有网站选项(我托管在同一个域上的 webroot 和 api)。我该如何实现?
答案1
如果我正确理解了你的问题,那么这应该可行:
server {
server_name play.example.com;
...
location ~ ^/u/(.*)$ {
return 301 $scheme://example.com/u/$1;
}
location ~ ^/b/(.*)$ {
return 301 $scheme://play.example2.net/b/$1;
}
}
答案2
就在今天早上,我很好奇如何有选择地将部分但不是全部路径重定向到另一台主机。
使用$request_uri
变量可以让我们免于编写正则表达式:
location /u/ {
return 301 $scheme://play.example2.net$request_uri;
}
只有匹配的请求/u/...
才会进入位置块并触发。这将重定向到目标主机上的return 301
相应位置,因为包含匹配的位置前缀。/u/...
$request_uri
位置中的尾部斜杠很重要,否则它会重定向以/u...
like/user
或开头的任何路径/ultron
。但这意味着它不会将请求重定向到 naked /u
。
如果您还想重定向裸露内容/u
,请使用前缀定义另一个位置=
:
location = /u {
return 301 $scheme://play.example2.net$request_uri;
}
文件中这两个位置的顺序无关紧要。Nginx 将优先匹配 ,而不= /u
是以 为前缀的其他位置/u...
。