不知道為啥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 把路徑中的
//
化简成一个/
了。