把www.ikscher.com/index.php?route=product/product&product_id=123 重定向到
www.ikscher.com/product/product&product_id=123
规则如下:
if ($request_uri ~* "(.*)index\.php\?route=(.*)"){
set $host_ $1;
set $last_ $2;
rewrite (.*) $host_$last_? permanent; #这里的.*代表的是url的原先地址,即要转向的url地址。
}
有几个知识点:
1:Rewrite的Flags
last -将rewrite后的地址重新在server标签执行。
break - 中止Rewirte,不再继续匹配
redirect - 返回临时重定向的HTTP状态302 url地址栏地址 为重定向后的地址
permanent - 返回永久重定向的HTTP状态301 url地址栏地址 为重定向后的地址(对POST传值可能会产生问题)
2:这段规则直接下到server里面,if后面必须有空格,否则报语法错误。
3:正则表达式的 点和问号都需要\斜杠转义。
4:nginx的问号处理,假如现在我要重定向到www.ikscher.com/?route=product/product&product_id=123
nginx在进行rewrite的正则表达式中只会将url中?前面的部分拿出来匹配,匹配完成后,
?后面的内容将自动追加到url中(包含?),如果不让后面的内容追加上去,请在最后加上?即可。如果想要?后面的内容时请使用$query_string
在这里提醒一点,调试的时候在rewrite的最后一个配置项中不要使用break last这些,使用redirect可以看到转换后的地址。综合以上几点,使用的配置项为
rewrite (*.)index.php(.*) $1$query_string? permanent;