Назад | Перейти на главную страницу

как перенаправить с www на лак без www

Как мне сделать автоматическое перенаправление любой ссылки типа 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);
    }
}