早上好!
出乎意料的是,我的網站(共享主機)今天早上因 500 內部服務器錯誤而停機。檢查服務器日志,我發現以下錯誤的許多副本:
[Wed Jun 08 8:44:17 2022] [core:alert] [pid 37935:tid 139960812291840] [client 172.71.94.83:22980] /usr/www/users/XXX/.htaccess: RewriteRule: cannot compile regular expression '^([A-Za-z]{2})\\/([[:alnum:]-\\/\\.] )$'
.htaccess 中的實際行是:
RewriteRule ^([A-Za-z]{2})\/([[:alnum:]-\/\.] )$ $2 [L]
我洗掉了這條線路,這使網站重新上線,但是我記得這條線路在途中的某個地方是需要的,而且該網站現在肯定在某個地方出現故障。
有誰知道如何修復這個正則運算式?更有趣的是,這些年來它怎么可能運作良好?
感謝您的任何提示。
uj5u.com熱心網友回復:
RewriteRule ^([A-Za-z]{2})\/([[:alnum:]-\/\.] )$ $2 [L]
????????????????????????????????????????????^
更高版本的 PCRE 引擎(由 Apache 使用)將在 POSIX 字符類(表示超過 1 個字母)之后的范圍說明符(連字符)處中斷。我認為這是為了匹配文字連字符(就像在早期版本的 PCRE 中那樣),在這種情況下,它應該位于字符類的開頭或結尾以避免歧義。
這個正則運算式也可以通過多種方式“簡化”(就我個人而言,我會避免使用 POSIX 字符類)。
- 在所述規則中,您不需要第一個捕獲組。(是否有任何條件-
RewriteCond指令 - 在此規則之前?) - 無需反斜杠轉義斜杠。
- 在字符類中使用時無需反斜杠轉義文字點。
請嘗試以下操作:
RewriteRule ^[A-Za-z]{2}/([a-zA-Z0-9/.-] )$ $1 [L]
請注意,洗掉第一個捕獲組后,替換變為$1,而不是$2。
[:alnum:]是一樣的[a-zA-Z0-9]。或者,\w如果您也可以匹配下劃線 ( ),則只需使用 (word character) _。
如果有參考反向參考的先前條件,$1那么您將需要添加回第一個帶括號的子模式并相應地調整替換字串。IE。
RewriteRule ^([A-Za-z]{2})/([a-zA-Z0-9/.-] )$ $2 [L]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488107.html
