2013-02-19 92 views
1

我想将某个目录下的合法目录名重定向到PHP文件。我发现this answer,这似乎是说,我可以做这样的事情在根的.htaccess:将嵌套目录重定向到.php

RewriteEngine on 
RewriteRule /([^/]+) processDir.php?dir=$1 [B,QSA] 

我想这就是我要找的,但有一个办法:

  • 将它限制在目录中,但允许嵌套目录?
  • 仅筛选目录:我不想处理文件。

回答

0

我打算删除这个问题,但有人收藏它,所以我会回答它。

使用像一个.htaccess这个

RewriteEngine on 
RewriteRule ([^/]*)/$ processDir.php [B,QSA] 

,然后你可以processDir.php这个变量来使用GET而不是:

<? 
dir is <?php 
echo $_SERVER["REQUEST_URI"]; 
?> 

我对正则表达式提出的主要修改(稍后有人会修正)是坚持在字符串的末尾加上斜线。

2

我想你要找的是RewriteCond,它可以让你有条件地应用重写规则。这一次检查,如果事情是一个目录:

RewriteCond %{REQUEST_FILENAME} -d 

你放在RewriteRule上面使用它,像这样:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule /([^/]+) processDir.php?dir=$1 [B,QSA] 

这将无论是在你的问题的方法或你的答案工作,需要注意的重要一点是,在应用规则之前,-d标志首先检查请求是否为有效的目录,这是您似乎想要的。

从我收集的内容来看,问题的第二部分是关于嵌套目录。你的正则表达式,特别是只查找一个目录(不用斜杠)。如果你想改变,你可以做这样的事情:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule /?some_dir/(.*) processDir.php?dir=$1 [B,QSA] 

这将需要以下some_dir任何有效目录和饲料是到PHP文件。

要注意的最后一件事是,你不需要把所有这一切都放到你的根.htaccess文件中。您可以将.htaccess文件放入您要重写的目录中。这样或那样做没什么区别,但我发现它可以简化语法,如果你不确定你在做什么。

+0

太棒了,谢谢。 +1,现在我有机会尝试这一切,我会回复评论(或者接受这个)。 [B,QSA]做什么(当然,你也可以链接到某些东西)? – 2013-02-20 18:06:13

+1

@Y B用于转义,QSA用于查询字符串。虽然,我只是单单从你的帖子中找到那些人。更多细节请参见http://httpd.apache.org/docs/current/rewrite/flags.html – 2013-02-21 00:26:28