今晚玩了下apache的重寫規則,發現一些被容易忽略的細節,分享一下。html
首先,說明一下實例環境的其餘相關配置:apache
documentRoot /var/www/html瀏覽器
.htaccess的放置路徑 /var/www/html/L-Production/public測試
一、替換規則的「絕對」和「相對」,例如:url
1 # Redirect Trailing Slashes... 2 RewriteRule ^(.*)/$ /$1 [L,R=301]
這是一個用重定向消除url最後斜槓的實現,這裏須要注意 /$1 的斜槓,它是一個「絕對」的寫法,當我在瀏覽器輸入http://127.0.0.1/L-Production/public/js/,意外發現url被重定向成http://127.0.0.1/js,而當我把 /$1 的斜槓去掉後,url才被重定向爲預期的http://127.0.0.1/L-Production/public/js。spa
二、模式匹配的對象與RewriteBase無關,只與.htaccess的所在目錄有關,例如:code
1 RewriteBase /L-Production 2 3 # Redirect Trailing Slashes... 4 RewriteRule ^(.*)/$ $1 [L,R=301]
在瀏覽器輸入http://127.0.0.1/L-Production/public/js/,url會被重定向成http://127.0.0.1/L-Production/js,而非http://127.0.0.1/L-Production/public/js。htm
這說明了 ^(.*)/$ 匹配的字符串是js/,而不是url中除去了/L-Production的public/js,RewriteBase隻影響替換規則。對象
另,我在最後的測試中還發現,當這裏的$1加上斜槓後,重定向結果仍然是http://127.0.0.1/L-Production/js,這說明在設置了RewriteBase後,全部的替換規則都變成了"絕對"的。blog