域到www.domain重定向

时间:2014-08-02 08:06:12

标签: redirect nginx varnish

我有一个nginx服务器背后的清漆,我正在尝试域名进行www.domain重定向。

我尝试在nginx上使用这些规则

   rewrite ^(.*) http://www.domain.com$1 permanent;
   return 301 ^ $scheme://www.domain.com$request_uri;
   return 301 http://www.domain.com$request_uri;

但是我在chrome中遇到错误,因为网站正在进入重定向循环。

由于关于解决方案不起作用,我在清漆中尝试了另一种写作规则

sub vcl_recv {
  // ...
  if ( req.http.host == "domain.com" ) {
    error 750 "http://www." + req.http.host + req.url;
  }
  // ...
}

sub vcl_error {
  // ...
  if (obj.status == 750) {
    set obj.http.Location = obj.response;
    # Set HTTP 301 for permanent redirect
    set obj.status = 301;
    return(deliver);
  }
  // ...
}

我正在使用清漆4,我收到一个错误,清漆无法编译代码。

Message from VCC-compiler:
Expected an action, 'if', '{' or '}'
('input' Line 29 Pos 3)
  error 750 regsub(req.http.host, "^www\.(.*)", "http://\1"); 
--#####------------------------------------------------------------------------------------------------------------------------

有人可以帮我解决这个问题吗?

我的服务器块如下:

server {
        listen  127.0.0.1:8080;
        root /home/webadmin/html/livesite;
        index index.php index.html index.htm;

        server_name www.domain.com;
#       rewrite ^(.*) http://www.domain.com$1 permanent;
#       return 301 ^ $scheme://www.domain.com$request_uri;
#       return 301 http://www.domain.com$request_uri;     
        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        error_page 404 403 /error/eror.html;
        location = /error/error.html {
                root /home/webadmin/html/livesite;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
             root /home/webadmin/html/livesite;
        }
        #pass the PHP scripts to FastCGI server listening on 127.0.0.1:9$
        location ~ \.php$ {
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;

                 }
}

2 个答案:

答案 0 :(得分:1)

这是保留uri和查询字符串的正确方法,

return 301 $scheme://www.domain.com$request_uri$is_args$query_string;

问题不在这一部分,问题出在你重定向到的地方,可能会重定向到另一个也进行另一次重定向的位置,我猜你不会有另一个服务器块来处理www服务器是单独的,所以你一遍又一遍地重定向到同一个地方,在你发布配置的其余部分之前不会确切知道。

修改

我说的问题是您要将www重定向到www服务器,以避免您应该创建一个与www不同的新服务器进行重定向

server { # the redirecting server
  listen 8080; # according to your config
  server_name domain.com; #without www
  return 301 $scheme://www.domain.com$request_uri$is_args$query_string;
}
server { # the actual serving server
  listen 8080;
  server_name www.domain.com;
  # the rest of your actual settings
}

答案 1 :(得分:0)

请改为使用varnish,并跳过apache重写。 这个例子总是重定向到https,但语义是相同的..

在sub vcl_recv中:

if ( req.http.host ~ "^(?i)domain.com" )
{
    set req.http.X-Redir-Url = "https://domain.com" + req.url;
    error 750 req.http.x-Redir-Url;
}

然后在sub vcl_error中:

if (obj.status == 750) {
    set obj.http.Location = obj.response;
    set obj.status = 302;
    return (deliver);
}