2012-09-24 108 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 ='参数会首先被使用)。 –