htaccess递归mod_rewrite

时间:2014-09-22 01:41:14

标签: apache .htaccess mod-rewrite

我喜欢使用mod_rewrite来重写一个实际上不存在创建虚拟结构的路径。一直困扰着我的问题,是假设我想重定向/ articles /,我发现我必须为每个子文件夹创建一个单独的规则,另外,为了处理带有或不带/的路径,还需要另一个规则,所以2 x我需要为每个路径或子路径写一个控制器的规则。以下是我一直在做的一个例子:

RewriteRule ^articles/$ /articles.php [NC,L,QSA]
RewriteRule ^articles$ /articles.php [NC,L,QSA]

另外,我最终不得不做这样的事情

RewriteRule ^articles/(.*)/$ /articles.php [NC,L,QSA]
RewriteRule ^articles/(.*)/(.*)/$ /articles.php [NC,L,QSA]
RewriteRule ^articles/(.*)/(.*)/(.*)/$ /articles.php [NC,L,QSA]
RewriteRule ^articles/(.*)/(.*)/(.*)/(.*)/$ /articles.php [NC,L,QSA]
RewriteRule ^articles/(.*)/(.*)/(.*)/(.*)/(.*)/$ /articles.php [NC,L,QSA]

RewriteRule ^pages/(.*)/$ /pages.php [NC,L,QSA]
RewriteRule ^pages/(.*)/(.*)/$ /pages.php [NC,L,QSA]
RewriteRule ^pages/(.*)/(.*)/(.*)/$ /pages.php [NC,L,QSA]
RewriteRule ^pages/(.*)/(.*)/(.*)/(.*)/$ /pages.php [NC,L,QSA]
RewriteRule ^pages/(.*)/(.*)/(.*)/(.*)/(.*)/$ /pages.php [NC,L,QSA]

我可能会在这里伸展,但这似乎非常低效,从逻辑上讲,必须有一种简单的方法来处理整个子文件夹及其所有子内容的控制。

我的问题是这个>>>对于我希望处理的每条路径,如何将其简化为一行?

1 个答案:

答案 0 :(得分:1)

您尝试的大部分内容都是不必要的,特别是因为您没有使用任何()捕获组来传递变量($1,$2等)。

由于.*匹配所有内容没有,因此它包含每个子目录(虚拟子目录),因为它也匹配/

因此,如果您想匹配/articles后跟其他任何内容,您可以使用以下方式进行匹配:

 RewriteRule ^articles(/.*)?$` /articles.php [NC,L,QSA]

?使整个()前一组可选,因此它可能包含或不包含尾随/ _或其他任何内容。

如果您尝试匹配请求URI开头的任何起始单词,并且如果它有相应的.php文件指向该单词,则可以使用-f来测试该PHP是否文件存在并重写,如果它存在:

# If the requested file or directory doesn't actually exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite the first word (before the first dot or /) into word.php
# This one rule covers both /pages and /articles
RewriteRule ^([^/.]+)(/.*)?$ $1.php [NC,L,QSA]

如果word.php不存在,则会产生404。

# OR...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Alternatively to the very generic rule above, you can list the 
# available words in it. This way you would only allow certain scripts
# to be written into .php
RewriteRule ^(articles|pages)(/.*)?$ $1.php [NC,L,QSA]