Мне нужно перенаправить www.example.com/docs/....pdf на trader.example.com/docs/....pdf в существующем проекте. То же самое и с * .biz. Понятия не имею, как извлечь wwww-Part из $ host-Variable.
server {
listen 80;
server_name www.example.com www.example.biz;
location /docs {
root /data/http/example/docs;
rewrite ^ $scheme://trader.$host$request_uri;
}
}
Кто-нибудь знает, как я могу это решить?
Добро пожаловать в 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
предпочтительнее для более быстрого выполнения оператора.
Вы можете удалить все 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
}