我想将某个目录下的合法目录名重定向到 PHP 文件。我发现这个答案似乎是说我可以在根 .htaccess 中做这样的事情:
RewriteEngine on
RewriteRule /([^/]+) processDir.php?dir=$1 [B,QSA]
我认为这是我正在寻找的,但有没有办法:
- 将其限制为仅目录,但允许嵌套目录?
- 仅过滤目录:我不想处理文件。
我认为您正在寻找的是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
文件放在要重写的目录中。以一种或另一种方式执行此操作没有太大区别,但我发现如果您不确定自己在做什么,它可以稍微简化语法。
I was going to delete this question, but someone favorited it, so I'll answer it instead.
Use an .htaccess like this
RewriteEngine on
RewriteRule ([^/]*)/$ processDir.php [B,QSA]
and then your processDir.php can work with this variable instead of using a get:
<?
dir is <?php
echo $_SERVER["REQUEST_URI"];
?>
The main modification I made to the regex (that somebody will later fix) is to insist that a slash is at the end of the string.