web-dev-qa-db-ja.com

リダイレクトDrupalマルチサイト非wwwからワニスを含むwwwへのリダイレクト/ nginx

Drupal 35サイトのマルチサイト(〜60の異なるドメイン)を構築しています。ドメインに関係なく、www以外のURLをwwwにリダイレクトしたいと思います。

NginxはすべてのドメインをDrupalインストールフォルダにリダイレクトしています。

私は成功せずにNginxでドメインをリダイレクトしようとしました(ワニスのためにそれは可能ですか?)

Varnishを使用して単一のドメインをリダイレクトすることはできましたが(「if domain == xxxその後www.domain.tldにリダイレクトする」など)、すべてのドメインに対して独自のリダイレクトルールを作成したくありません。

2
naw

私は次のnginx設定でそれを行うことができました:

if ($Host !~* ^www\.) {
   rewrite ^(.*)$ http://www.$Host$1 permanent;
}
1
naw
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);
   }
}
1
Dg Protools

varnishのマニュアルにある次のようなものが機能します。

sub vcl_recv {
    if (req.http.Host ~ "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$") {
        error 750 regsub(req.http.Host, "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$", "http:///www.\1.\2" + req.url);
    }


sub vcl_error {
    if (obj.status == 750) {
        set obj.http.Location = obj.response;
        set obj.status = 301;
        return(deliver);
    }
}
0
ADM

非wwwからwwwリダイレクトはバックエンドをリクエストする前にVarnishによって処理される、ループなどの奇妙なエラーを回避するため、バックエンド接続なし...

sub vcl_recv(これはVCL 4構文です):

sub vcl_recv {
    #THIS IS THE IMPORTANT POINT
    #redirect non www to www domains ip no subdomain defined
    if (req.http.Host ~ "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$") {
       return (synth (750, ""));
    }

    # Normalize the header, remove the port
    set req.http.Host = regsub(req.http.Host, ":[0-9]+", "");

    #OFTEN SHIPS WITH THIS OTHER ONE, COMMENT IT OTHERWISE IT WILL FAIL
    #set req.http.Host = regsub(req.http.Host, "^www\.", "");

    # For the sake of example, a couple of custom backends, 
    # note www is specified in the req.http.Host
    if (req.http.Host ~ "foo.example.tld") {
         set req.backend_hint = example;
    }
     elseif (req.http.Host ~ "www.other.com") {
         set req.backend_hint = other;
    }

sub vcl_synth、 これを追加 :

if (resp.status == 750) {
    #redirect non www to www
    set resp.status = 301;
    set resp.http.Location = "http://www." + req.http.Host + req.url;
    return(deliver);
}

最後に、vhostsでは、2つのサーバーブロックを用意する必要はありません。コメントするか、www以外のブロックを削除できます。

#server {
#        listen 1.2.3.4:8080;
#        server_name example.tld;
#        return 301 http://www.example.tld;
#}

server {
        listen 1.2.3.4:8080;
        server_name www.example.tld;
0
Kojo