我有以下RewriteRule指令.htaccess:
RewriteRule ^work/([a-zA-z0-9\-]*).html$ work.php?go=$1 [L]
RewriteRule ^work/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*).html$ work.php?go=$1&sub=$2 [L]
RewriteRule ^work/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*).html$ work.php?go=$1&sub=$2&pid=$3 [L]
RewriteRule ^work/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*).html$ work.php?go=$1&sub=$2&pid=$3&pad=$4 [L]
RewriteRule ^work/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*)/([a-zA-z0-9\-]*).html$ work.php?go=$1&sub=$2&pid=$3&pad=$4&id=$5 [L]
一切正常。
但是有沒有人知道,我如何才能將所有這一行作為唯一的一條規則放在一行中?
uj5u.com熱心網友回復:
您不能將這些簡化為單個規則并使其“完全”相同地作業。在單個規則中,所有 URL 引數將始終被定義(但可能為空)。使用您當前的規則集,僅在需要時才定義 URL 引數 - 細微差別。如果你對這個細微的差別沒有意見(你應該同意),那么這些規則可以簡化為一個規則。
首先,我建議對您現有的正則運算式進行一些小的更改:
我會假設最終的路徑段,即。, 之前的“檔案名”
.html是強制性的。目前,您允許/work/.html(這會導致一個空的goURL 引數)。其他 URL 引數應接受 1 個或更多字符,而不是 0 個或更多字符。它實際上不會“匹配” 0 個字符,因為在與
RewriteRulepattern匹配的 URL-path 中減少了多個連續的斜杠。我會簡化您在路徑段中匹配的正則運算式。從
[a-zA-z0-9\-]到[\w-]。這與之前的匹配加上下劃線 (_) 相同。在字符類的開頭或結尾使用時,無需反斜杠轉義文字連字符。
由于您在所有路徑段中匹配相同的模式,因此“組合”規則不會變得過于復雜,因為您可以附加另一個路徑段并使其對于每個附加 URL 引數可選(所有前面的路徑段必須首先匹配) . 但是,如果您在每個路徑段中匹配不同的正則運算式,情況會復雜得多 - 這將涉及許多嵌套組以保持正確的匹配順序。
考慮到以上幾點,您的 5 條規則可以合并為以下單一規則:
RewriteRule ^work/([\w-] )(?:/([\w-] ))?(?:/([\w-] ))?(?:/([\w-] ))?(?:/([\w-] ))?\.html$ work.php?go=$1&sub=$2&pid=$3&pad=$4&id=$5 [L]
在第一個強制路徑段(即([\w-] ))之后,(?:/([\w-] ))?為每個附加的可選路徑段附加正則運算式。
這導致以下重寫:
/work/.html- 未重寫/work/abc.html->work.php?go=abc&sub=&pid=&pad=&id=/work/abc/def.html->work.php?go=abc&sub=def&pid=&pad=&id=/work/abc/.html- 未重寫/work/abc/def/ghi/jkl/mno.html->work.php?go=abc&sub=def&pid=ghi&pad=jkl&id=mno/work/abc/def/ghi/jkl/mno/.html- 未重寫/work/abc/def/ghi/jkl/mno/pqr.html- 未重寫
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317886.html
