我想使用友好的urls:
RewriteRule ^([A-Za-z0-9_-]+)/$ pages/$1.php [QSA,L]
但同时,我希望/forum/folder
被排除在.htaccess
文件中的规则之外。
我怎么能这么做?
发布于 2017-04-15 09:01:57
RewriteRule ^(A-Za-Z0-9-+)/$ pages/$1.php QSA,L ..。我希望
/forum/folder
被排除在外
你的RewriteRule
模式(即。^([A-Za-z0-9_-]+)/$
)已经排除了URL-path /forum/folder
,因为模式不允许在URL-path中间使用斜杠(目录分隔符);只有在结束时。
所以,如果/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
标志,因为请求中的查询字符串默认是追加的。只有在替换中指定查询字符串,并且需要将其与请求中的查询字符串合并时,才需要此标志。正如Deadooshka在注释中提到的,\w
是[A-Za-z0-9_]
的一个简短的手动字符,因此这稍微简化了正则表达式。
#2 -排除规则:在文件开始时使用与要排除的路径匹配的规则,并简单地停止处理。例如:
RewriteRule ^forum/folder - [L]
如果请求的URL以/forum/folder
开头,那么就在这里停止,不再处理进一步的规则。
#3 -否定条件:在规则本身中包含一个否定的条件(RewriteCond
指令)。例如:
RewriteCond %{REQUEST_URI} !^/forum/folder
RewriteRule ^([\w-]+)/$ pages/$1.php [L]
只有当请求的RewriteRule
不以/forum/folder
开头时,这才会处理/forum/folder
。!
前缀在CondPattern上否定正则表达式。
#4 -模式中的负查找:如果您只有一个规则和一个要从该规则中排除的URL,那么可以在RewriteRule
模式(regex)中使用一个负前瞻性。例如,若要排除上述指令中的URL /forum
,请执行以下操作:
RewriteRule ^((?!forum)[\w-]+)/$ pages/$1.php [L]
(?!forum)
是负前瞻。
https://stackoverflow.com/questions/43428416
复制