将%3F等重写为特殊字符(?和=)Nginx

时间:2014-01-09 01:14:01

标签: apache nginx rewrite

嗨我的服务器出了问题。我有4个到网页的入站链接,看起来像这样:

myurl.com/default/page.php%3Fid%3D13

他们应该是这样的:

myurl.com/default/page.php?id=13

我需要做些什么来实现这个目标?当您访问已编码的URL链接时,Apache会发出404错误

3 个答案:

答案 0 :(得分:0)

你试过urldecode吗?看起来你正在以某种方式获取URL编码。如果urldecode不能解决问题,那么你可以编写一个函数来使用像this这样的地图解码这些特定字符。

答案 1 :(得分:0)

一个可能的解决方案(虽然我不会说它是一个好的解决方案)是设置一个尝试解码URL的404处理程序。也许你可以做一些花哨的匹配来试图猜测404是否是由于URL被编码。

if(stripos($url, '%3F') !== false){
    header('Location: ' . urldecode($url) );
    exit;
}

答案 2 :(得分:0)

nginx将请求的文件名与args分开,并对规范化的URI进行操作,因此,在locationrewrite的第一个参数中,%3F部分只能匹配直接由?字符(而请求中的显式?将永远不会在此处填写),如下:

rewrite     ^/([^?]*)\?(.*)$    /$1?$2?     permanent;

更多细节:https://stackoverflow.com/a/21144014/1122270