Как мне сделать автоматическое перенаправление любой ссылки типа www.example.com на example.com.
Я хотел бы сделать это для всех ссылок, которые попадают в экземпляр varnish (поэтому мне не нужно индивидуально определять значение для всего домена, который попадает на сервер).
Я пробовал использовать следующее:
if(req.http.host ~ "^www\.(.+)$"){
set req.http.host = regsub(req.http.host, "^www\.", "");
}
Это работает, но проблема в том, что он попадает в правый бэкэнд, но не перенаправляет. Я понимаю отсюда: https://www.varnish-cache.org/vmod/redirect вы можете перенаправить на URL-адрес, но я не уверен, как получить «полный» URL-адрес из varnish, чтобы удалить www и перенаправить.
Любая помощь будет оценена по достоинству!
Большое спасибо!
Джейсон
Varnish не имеет собственного механизма перенаправления с vcl_recv()
. Вместо этого вы должны выдать ошибку из vcl_recv()
быть пойманным в vcl_error()
. Это потому что vcl_recv()
не имеет доступа к объекту ответа. Ты можешь прочтите о том, как это делается. Ниже я попытаюсь дать ответ с точки зрения вашей ситуации.
В vcl_recv()
:
if (req.http.host ~ "^www\.") {
error 750 regsub(req.http.host, "^www\.(.*)", "http://\1"); //Capture everything after the www. and place it after a http://
}
В vcl_error()
:
if (obj.status == 750) {
set obj.http.Location = obj.response;
set obj.status = 302;
return(deliver);
}
vcl 4.0;
sub vcl_recv {
if (req.http.host ~ "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$") {
return (synth (750, ""));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.status = 301;
set resp.http.Location = "http://www." + req.http.host + req.url;
return(deliver);
}
}
Вот мое решение для VCL 4.x.
Сначала убедитесь, что "начинается" с www. Затем выполните регулярное выражение www. с самого начала и установите новое местоположение
sub vcl_recv {
if (req.http.host ~ "^www\.") {
return (synth (750, ""));
}
}
sub vcl_synth {
if (resp.status == 750) {
set resp.status = 302;
set resp.http.Location = "http://" + regsuball(req.http.host, "^www\.", "") + req.url;
return(deliver);
}
}