如何在.htaccess中创建例外

时间:2017-04-15 16:24:51

标签: .htaccess mod-rewrite

我想使用友好的网址:

RewriteRule ^([A-Za-z0-9_-]+)/$ pages/$1.php [QSA,L]

但与此同时,我希望/forum/folder文件中的.htaccess被排除在该规则之外。

我该怎么做?

1 个答案:

答案 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)是否定前瞻。