2013-03-24 70 views
3

最近我搬到了一個基於Java的PHP平臺的新系統。新網站有漂亮的網址,如: -光油重定向

http://mysite.com/science/2013/03/22/universe-is-older-than-previously-thought

舊的網站已經像-mysite.com/details.php?cid=37 & ID = 239411

對於搜索引擎結果的網址,我們需要重定向所有這些包含/details.php的URL?到主頁,說urlredirect.com。我一直在看這些示例https://www.varnish-cache.org/trac/wiki/VCLExampleRedirectInVCL,並在我的Varnish配置的redirect.vcl中提出了以下內容。

在vcl_recv功能 -

if(req.url~ "^/details.php?$") { 
error 301 "Moved Temporarily"; 
    } 

但我很困惑應該是什麼那裏vcl_error功能?現在它是這樣的 -

else if(obj.status == 301 && req.url~ "^/details.php?$"){ 
    set obj.http.Location = "http://bdnews24.com"; 
    return (deliver); 
    } 

我認爲這很簡單?仍然能與分享經驗的人分享經驗。

回答

5

最好是創建自定義錯誤代碼,然後將重定向URL發送到那裏,而不必在vcl_error中重複自己。一個簡單的例子:

在vcl_recv:

set req.http.x-Redir-Url = "http://newdomain.com" + req.url; 
error 750 req.http.x-Redir-Url; 

在vcl_error:

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

謝謝。是的,這樣做更安全。 – 2013-03-30 09:11:21

+1

請注意,這不適用於清漆4! - 看到另一個答案。 – zwirbeltier 2015-01-22 18:16:59

8

如果你想這樣做,在光油4.0,做它的方式已經改變了一下

#default.vcl 

sub vcl_recv { 
    if (req.req.url~ "^/details.php?$") { 
    return (synth (750, "")); #This throws a synthetic page so the request won't go to the backend 
    } 
} 

sub vcl_synth { 
    if (resp.status == 750) { 
    set resp.status = 301; 
    set resp.http.Location = "http://bdnews24.com"; 
    return(deliver); 
    } 
}