以下是我的.htaccess規則,第一條規則是針對example.com/search-words但顯示 404 錯誤代碼,當您像這樣到達它example.com/search words時,第二條規則example.com/s/search-words同時適用。
RewriteRule ^([a-zA-Z0-9-z\-] )/?$ search_main.php?q=$1
RewriteRule ^s/(.*)?$ search_main.php?q=$1
我該如何解決?
uj5u.com熱心網友回復:
RewriteRule ^([a-zA-Z0-9-z\-] )/?$ search_main.php?q=$1
第一條規則中的RewriteRule 模式不允許使用空格。請嘗試以下操作:
RewriteRule ^([a-zA-Z0-9\s-] )/?$ search_main.php?q=$1 [L]
該RewriteRule 模式與 %-decoded URL-path 匹配。 是一個 URL 編碼的空格,所以這個正則運算式必須匹配一個文字空格字符。
速記字符類\s表示任何空白字符。
在最后一個連字符之前的字符類中有一個錯誤的-z字符序列。在字符類的開頭或結尾使用時,無需反斜杠轉義文字連字符。
您還應該在L此處包含標志。
更新:
RewriteRule ^([a-zA-Z0-9:.–\s-] )/?$ search_maiin.php?q=$1 [L]Dot 正在將主頁重定向到 index.php @MrWhite
該點現在可能會導致與其他規則(例如前端控制器模式)發生沖突,因為它現在可能會匹配實際檔案,例如index.php.
您可以對以 結尾的搜索短語進行例外處理.php,例如使用否定前瞻:^(?!. \.php$)([a-zA-Z0-9:.–\s-] )/?$. 換句話說:
RewriteRule ^(?!. \.php$)([a-zA-Z0-9:.–\s-] )/?$ search_main.php?q=$1 [L]
或者,確保該規則僅適用于初始請求,而不適用于重寫請求。例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^([a-zA-Z0-9:.–\s-] )/?$ search_main.php?q=$1 [L]
注意:您修改后的規則中有search_maiin.php(兩個is)(我認為這是一個錯字)?
更新#2:
我直接請求 [index.php]。
我不希望你index.php直接請求。這確實會與上述規則產生沖突,因為對index.php(或直接請求的任何.php檔案)的請求將被路由到search_main.php.
請嘗試以下操作,以專門排除對物理檔案(和目錄)的請求:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9:.–\s-] )/?$ search_main.php?q=$1 [L]
更新#3:
我如何匹配和登錄網址?
/MP3: Quavo & Takeoff – Nothing Changed
添加&到(中間的)正則運算式字符類 - 這個字符在正則運算式中沒有特殊含義。但是,您可能還需要將B標志添加到該規則中,以便&在查詢字串中進行 URL 編碼,并且不會將其視為查詢字串中的 URL 引數分隔符。
例如:
:
RewriteRule ^([a-zA-Z0-9:.–&\s-] )/?$ search_main.php?q=$1 [B,L]
更新#4
我們也可以允許表情符號嗎?
與其關注允許的不斷增加的字符型別,不如只關注您不想要的字符,例如。斜線。
要匹配除斜杠以外的所有內容(即包含單個路徑段的 URL),請將RewriteRule指令更改為:
:
RewriteRule ^([^/] )/?$ search_main.php?q=$1 [B,L]
[^/]是一個否定字符類,它匹配除斜杠之外的任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512567.html
上一篇:追加查詢字串的重寫沒有觸發?
下一篇:谷歌應用引擎對超時實體的精確計算
