2017-04-15 47 views
1

例外我想使用友好的URL:如何创建在.htaccess

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

但在同一时间,我想/forum/folder从在.htaccess文件规则被排除在外。

我该怎么做?

+1

'A-Za-z0-9_'是'\ w' – Deadooshka

回答

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标志,由于从请求的查询字符串被默认追加。只有当您在替代中指定查询字符串并且您需要将其与请求上的查询字符串合并时,您是否需要此标志。正如Deadooshka在评论中提到的那样,\w[A-Za-z0-9_]的简写字符,所以这简化了正则表达式。


#2 - 排除规则:使用你的文件要排除和简单地停止处理的路径相匹配开始的规则。例如:

RewriteRule ^forum/folder - [L] 

如果请求的URL与/forum/folder然后开始停止在这里并没有进一步的处理规则。


#3 - 否定的条件:包括一个否定 conditon(RewriteCond指令)在规则本身。例如:

RewriteCond %{REQUEST_URI} !^/forum/folder 
RewriteRule ^([\w-]+)/$ pages/$1.php [L] 

这将只处理RewriteRule请求的URL不/forum/folder启动。CondPattern上的!前缀抵消了正则表达式。


#4 - 在RewriteRule模式负前瞻:如果你只需要你想从这个规则中排除一个规则,一个URL,那么你可以在RewriteRule模式使用负先行 (正则表达式)。例如,为了排除在上述指令中的URL /forum

RewriteRule ^((?!forum)[\w-]+)/$ pages/$1.php [L] 

(?!forum)是负先行。

+0

没有工作:( –

+0

请将您试过的代码添加到您的问题中,如果您的'.htaccess'文件中有其他指令,则添加你的整个'.htaccess'文件 - 可能会有冲突。另外,在子目录中是否还有其他'.htaccess'文件? – MrWhite

+0

由于你的现有指令已经排除了URL路径如果在这个子目录中有一个额外的'.htaccess'文件,那么这可能是它不工作的原因,我已经更新了我的答案。 – MrWhite