我想使用友好的网址:
RewriteRule ^([A-Za-z0-9_-]+)/$ pages/$1.php [QSA,L]
但与此同时,我希望/forum/folder
文件中的.htaccess
被排除在该规则之外。
我该怎么做?
答案 0 :(得分:2)
RewriteRule ^([A-Za-z0-9_-]+)/$ pages/$1.php [QSA,L]
...我希望排除
/forum/folder
您的RewriteRule
模式(即。^([A-Za-z0-9_-]+)/$
)已经排除了URL路径/forum/folder
,因为模式不允许使用斜杠(目录分隔符)在URL路径的中间;只在结束时。
因此,如果/forum/folder
仍然被路由,则其他正在执行此操作。如果此子目录中有一个额外的.htaccess
(假设它是一个物理目录)使用mod_rewrite,那么您可能会遇到冲突。
否则,有几种方法可以例外:
#1 - 排除所有文件和文件夹:如果您特别想要排除所有文件和文件夹被重写(假设/forum/folder
是物理目录),那么您可以专门检查如果URL路径未映射到文件或目录,则仅处理RewriteRule
。例如:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)/$ pages/$1.php [L]
此处不需要QSA
标志,因为默认情况下会附加来自请求的查询字符串。只有在 substitution 中指定查询字符串并且需要将其与请求中的查询字符串合并时,才需要此标志。正如Deadooshka在评论中提到的那样,\w
是[A-Za-z0-9_]
的简写字符,所以这简化了正则表达式。
#2 - 排除规则:在文件开头使用与要排除的路径匹配的规则,然后停止处理。例如:
RewriteRule ^forum/folder - [L]
如果请求的网址以/forum/folder
开头,请停在此处,不要处理其他规则。
#3 - 否定条件:在规则本身中包含否定的条件(RewriteCond
指令)。例如:
RewriteCond %{REQUEST_URI} !^/forum/folder
RewriteRule ^([\w-]+)/$ pages/$1.php [L]
如果请求的网址不以RewriteRule
开头,则只会处理/forum/folder
。 CondPattern 上的!
前缀否定了正则表达式。
#4 - RewriteRule
模式中的否定前瞻:如果您只想从此规则中排除一个规则和一个网址,则可以使用否定前瞻在RewriteRule
模式(正则表达式)中。例如,要在上述指令中排除URL /forum
:
RewriteRule ^((?!forum)[\w-]+)/$ pages/$1.php [L]
(?!forum)
是否定前瞻。