我喜欢使用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]
我可能会在这里伸展,但这似乎非常低效,从逻辑上讲,必须有一种简单的方法来处理整个子文件夹及其所有子内容的控制。
我的问题是这个>>>对于我希望处理的每条路径,如何将其简化为一行?
答案 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]