2017-08-29 86 views
2

我需要一些幫助,正確RewriteRulehtaccess RewriteRule匹配URL路徑中的特殊字符

需要URL,並在最後JSON字符串:

http://hns/log/r/%7B"start":%5B55.70980850022872,37.505353142456336%5D,"end":%5B55.70980850022872,37.77039830847196%5D,"points":%5B%5B55.67529029803404,37.62070958776883%5D%5D,"method":"1","optimization":"1","center":%5B55.731512133266634,37.71615331335479%5D,"zoom":10%7D 

重定向到

http://hns/log/r/index.html 

無需在瀏覽器上更改URL。

.htaccess是:http://hns/log/r/,132a

RewriteEngine on 
RewriteBase /log/r/ 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
#RewriteRule ^([^/]+)$ ./index.html?catalog=$1[L] 
RewriteRule ^([A-Za-z0-9?;:,{}\"]+)$ ./index.html [L] 

它與像URL效果很好。 但不適用於以下網址:http://hns/log/r/,132a:或帶引號(")或JSON字符串。

如何正確重定向這樣的URL?

+0

這個'.htaccess'文件在哪裏?我認爲它必須在'/ logist/route/.htaccess'中? '/ log/r /'是'/ logist/route /'的縮寫嗎?或者一個完全不同的URL路徑? – MrWhite

+1

對不起,重定向應該是'http:// hns/log/r/index.html'。 .htaccess文件在'http:// hns/log/r' –

回答

0

它看起來像你也許在Windows機器上測試這個?在Windows操作系統上,冒號(:)和報價(")字符不允許使用文件名字符。所以當Apache試圖將請求映射到一個文件系統路徑(如果/log/r是一個文件系統目錄,它會這樣做),你會得到一個錯誤(這可能導致Apache服務一個403 Forbidden),而不管你的mod_rewrite正則表達式,其中已包含這些字符。在Windows

其他違禁文件名字符:\/:*?"<>|

如果你需要這個在Windows上工作,那麼你需要改變你的URL結構。例如。使用PATH_INFO或查詢字符串。

但是,您現有的代碼應該已經在Linux機器上適用於表格http://hns/log/r/,132a:(包含冒號)或引號(")字符的URL。

http://hns/log/r/%7B"start":%5B55.70980850022872,37.505353142456336%5D,"end":%5B55.70980850022872,37.77039830847196%5D,"points":%5B%5B55.67529029803404,37.62070958776883%5D%5D,"method":"1","optimization":"1","center":%5B55.731512133266634,37.71615331335479%5D,"zoom":10%7D

然而,張貼因爲你還沒有包括所有必要的字符上面給出的形式的JSON字符串將無法正常工作的代碼。您缺少[].(點/週期)。請注意,RewriteRule模式與%解碼的URL路徑相匹配。所以,這應該是這樣寫如下:

RewriteRule ^([A-Za-z0-9?;:,{}"\[\].]+)$ index.php [L] 

還請注意我已刪除了./前綴的RewriteRule替代。前綴./不是必需的(並且不嚴格正確)。如果前綴爲./ mod_rewrite只是將替代視爲相對(即它不以斜槓或方案+主機名開頭),並且將簡單地應用目錄前綴。在這種情況下,生成的URL路徑將爲/log/r/./index.php - 但是,操作系統和「作品」仍可正確解決此問題。

+1

謝謝,很好的回答! –