Drupal 35サイトのマルチサイト(〜60の異なるドメイン)を構築しています。ドメインに関係なく、www以外のURLをwwwにリダイレクトしたいと思います。
NginxはすべてのドメインをDrupalインストールフォルダにリダイレクトしています。
私は成功せずにNginxでドメインをリダイレクトしようとしました(ワニスのためにそれは可能ですか?)
Varnishを使用して単一のドメインをリダイレクトすることはできましたが(「if domain == xxxその後www.domain.tldにリダイレクトする」など)、すべてのドメインに対して独自のリダイレクトルールを作成したくありません。
私は次のnginx設定でそれを行うことができました:
if ($Host !~* ^www\.) {
rewrite ^(.*)$ http://www.$Host$1 permanent;
}
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);
}
}
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);
}
}
非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;