不知道为啥rewrite后少了个斜杠
下面是go.php代码
<?php $url=$_GET['url']; $url=urldecode($url); echo $url; ?>
rewrite规则如下
RewriteEngine On RewriteRule ^go/(.*)$ go.php?url= [QSA]
学习是最好的投资!
参考 Why is Apache removing multiple slashes? @Pekka 웃 指出URI中的多个相邻的/不符合RFC标准,@Pekka 웃 猜测Apache被设计为将多个相邻的/合并成一个。
/
同样,我搜索后了解到在nginx中有merge_slashes这样一项配置,用于开启或者关闭将请求URI中相邻两个或更多斜线合并成一个的功能,默认这项配置是开启的。由此可见,apache和nginx默认在处理URI中多个相邻/时行为时一致的,都遵循了RFC标准。
至于http://localhost/go.php?url=http://www.163.com/中的//没有合并成一个,而 http://localhost/go/http://www.163.com/中的//被合并成一个,应该是前者符合RFC标准,而后者不符合。
//
没有深入了解RFC标准,所以上面的说法可能不够严密,如有纰漏,望指出。但了解到这种程度个人觉得已经差不多了,至于rewrite规则或代码怎么改,就请楼主自行google之吧。
http://php.net/manual/zh/function.urldecode.php
我猜是 Apache 把路径中的 // 化简成一个 / 了。
参考 Why is Apache removing multiple slashes?
@Pekka 웃 指出URI中的多个相邻的
/
不符合RFC标准,@Pekka 웃 猜测Apache被设计为将多个相邻的/
合并成一个。同样,我搜索后了解到在nginx中有merge_slashes这样一项配置,用于开启或者关闭将请求URI中相邻两个或更多斜线合并成一个的功能,默认这项配置是开启的。由此可见,apache和nginx默认在处理URI中多个相邻
/
时行为时一致的,都遵循了RFC标准。至于http://localhost/go.php?url=http://www.163.com/中的
//
没有合并成一个,而 http://localhost/go/http://www.163.com/中的//
被合并成一个,应该是前者符合RFC标准,而后者不符合。没有深入了解RFC标准,所以上面的说法可能不够严密,如有纰漏,望指出。但了解到这种程度个人觉得已经差不多了,至于rewrite规则或代码怎么改,就请楼主自行google之吧。
http://php.net/manual/zh/function.urldecode.php
我猜是 Apache 把路径中的
//
化简成一个/
了。