我必须将 www.example.com/docs/....pdf 重定向到现有项目上的 trader.example.com/docs/....pdf。这同样适用于 *.biz。我不知道如何从 $host-Variable 中提取 wwww-Part。
server {
listen 80;
server_name www.example.com www.example.biz;
location /docs {
root /data/http/example/docs;
rewrite ^ $scheme://trader.$host$request_uri;
}
}
有人知道我该如何解决这个问题吗?
答案1
欢迎来到 ServerFault。
您可以使用地图指令来提取部分值$host
,如下所示......
map $host $tld {
default $host;
'~^www\.(?<domain>.*)$' $domain;
}
server {
listen 80;
server_name www.example.com www.example.biz;
location /docs {
root /data/http/example/docs;
return $scheme://trader.$tld$request_uri;
}
}
map
指令有助于提取$tld
不包含www.
URL 部分的值。作为题外话,没有必要使用rewrite
语句。由于上面的代码中没有对正则表达式的求值,因此return
最好使用语句来更快地执行。
答案2
您可以www
从域中删除所有内容。此配置应该有帮助。
server {
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
server {
server_name www.example.biz;
return 301 $scheme://example.biz$request_uri;
}
server {
listen 80;
server_name example.com example.biz;
location /docs {
root /data/http/example/docs;
rewrite ^ $scheme://trader.$host$request_uri;
}
}
更新:如果您希望从多个主机名中删除 www,则可以将其添加到可以捕获主机名的服务器块中(注意:如果可能,以上方法更好)。
if ($host ~* www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*)$ $scheme://$host_without_www$1 permanent; #1
#rewrite ^ $scheme://$host_without_www$1request_uri permanent; #2
}
答案3
这是我使用的方法,效果很好:
server
{
if ($host ~* ^www\.(.*)) {
set $host_without_www $1;
rewrite ^(.*) https://$host_without_www$1 permanent;
}
}