我有一个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;
}
}
答案 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);
}