2012-09-24 104 views
0

我想重定向像http://mysite.com/?action=add&goback=1http://myiste.com/add/?goback=1的URL。nginx重寫重定向規則無法正常工作

我來:

location/{ 
    if ($request_uri ~* /\?action.*) { 
     add_header Cache-Control private; 
     rewrite ^/\?action=([^&]*)&?(.*)$ /$1/?$2 permanent; 
    } 
} 

,但它不工作,我不明白爲什麼。

P.S.我需要add_header只是表示if ($request_uri ~* /\?action.*) {發生。 我嘗試了其他幾種解決方案,如

rewrite ^/\?action=(\w+).*$ /$1/?$query_string permanent; 

沒有成功。

UPDATE

的實際目標是:

如果URL看起來像這樣

http://mysite.com/add/?param1=param1&... 

/(添加)/應成爲一個行動PARAM:

location ~ /[\-\w]+/ { 
    rewrite ^/([^/]*).*$ /?action=$1 last; 
    ... 
} 

這似乎是正常工作,我想我不需要額外幫助,這一個

如果URL是這樣的:

http://mysite.com/?action=add&param1=param1&... 

nginx的應該重定向到:

http://mysite.com/add/?param1=param1&... 

當我嘗試做這部分我得到的結果我不t需要 - 無限重定向循環,URLs如http://mysite.com/add/?action=add&param1=param1&...

有解決方案來解決我的目標嗎?

回答

1

這是因爲rewrite只匹配URI路徑,沒有查詢sting aka參數,很像location。嘗試這樣的事情,而不是:

location =/{ 
    if ($arg_action) { 
     rewrite^/$arg_action/ permanent; 
    } 
} 

location = /檢查將確保如果有action=...參數,rewrite^/$arg_action/ permanent;居然會做重寫的URI重定向規則僅適用於要求/if ($arg_action)檢查。查詢字符串將從原始請求中保留(默認情況下)。

請參閱http://nginx.org/r/rewrite瞭解文檔。

+0

我想我更清楚我實際需要什麼(問題會更新)。你的回答很有幫助,但我得到了一個重定向到'/ add /?action = add',這不正是我所需要的。 – Nemoden

+0

+ 1'd,但是,對不起, - 不能接受。 – Nemoden

+0

擺脫'action = add'就像添加一個沒有'action = add'的查詢字符串到重寫替換字符串一樣簡單,並且添加另一個'?'以避免默認查詢字符串追加。像'重寫^/$ arg_action /?$ newquery?永久的;'會做的伎倆。如何構建'$ newquery'變量作爲練習留給讀者(提示:'map $ args $ newquery {〜^ action = add \&(?。+)$ foo; }'會是一個很好的起點,但它並沒有涵蓋所有可能的情況,因爲通常不能保證'action ='參數會首先被使用)。 –