我正在使用以下重寫規則重寫“domain.com/lolmeter/platformValue/usernameValue”(platformValue 和 usernameValue 是用戶通過文本輸入請求的值):
RewriteRule ^lolmeter/([a-zA-Z0-9]*)/([a-zA-Z0-9]*)$ /lolmeter.html?platform=$1&username=$2 [L]
button.href = lolmeter/platformValue/usernameValue
我注意到當用戶輸入空格或其他非字母數字值時,它會自動用“%”符號編碼,所以我嘗試重寫規則以接受它們,例如:
RewriteRule ^lolmeter/(([a-zA-Z0-9]|%)*)/(([a-zA-Z0-9]|%)*)$ /lolmeter.html?platform=$1&username=$2 [L]
但它不起作用,我認為是因為括號。那么我應該使用哪個符號來表示內部“|” ?
PS:是否有更流行或更現代的方式來更改 URL?
uj5u.com熱心網友回復:
RewriteRule ^lolmeter/(([a-zA-Z0-9]|%)*)/(([a-zA-Z0-9]|%)*)$ /lolmeter.html?platform=$1&username=$2 [L]
該RewriteRule 模式與 %-decoded URL-path 匹配。因此,如果請求的 URL 路徑中存在編碼空格(即 ),則該規則與文字空格匹配,而不是 .
您可以\s在正則運算式的字符類中使用速記字符類來匹配任何空白字符。
例如:
RewriteRule ^lolmeter/([a-zA-Z0-9\s] )/([a-zA-Z0-9\s]*)$ /lolmeter.html?platform=$1&username=$2 [L]
請注意,我在第二個/中間路徑段上添加了量詞, 而不是*因為我假設中間路徑段不是可選的。請注意,在匹配正則運算式之前,URL 路徑中的多個連續斜杠也會減少,因此如果省略中間路徑段,則傳遞的用戶名將被視為平臺,我敢肯定這不是本意。
還要注意,在上面的空間沒有在結果重寫中重新編碼。使用該標志將空間B重新編碼為查詢字串中的 a。(如果您特別需要重新編碼空間,那么也使用該標志 - 需要 Apache 2.4.26) BNP
PS:是否有更流行或更現代的方式來更改 URL?
不確定你的意思,但 Apache 上的mod_rewrite 是URL 重寫模塊。一直都是,而且可能永遠都是。
但是,您不一定需要按照您所做的方式重寫請求,盡管您可能仍希望以類似的方式匹配 URL(取決于您正在執行的其他操作)。您也許可以只重寫請求lolmeter.html并讓您的腳本直接決議 URL 路徑,而不是查詢字串。
或者,我認為“現代方式”是將所有內容重寫為“前端控制器” - 一個決議 URL 并適當“路由”請求的入口腳本。這避免了在.htaccess. 盡管這不是什么“新事物”,但它可能已經變得更加普遍。許多 CMS/框架使用這種模式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/429731.html
