1

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

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

我认为这是我正在寻找的,但有没有办法:

  • 将其限制为仅目录,但允许嵌套目录?
  • 仅过滤目录:我不想处理文件。
4

2 回答 2

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文件放在要重写的目录中。以一种或另一种方式执行此操作没有太大区别,但我发现如果您不确定自己在做什么,它可以稍微简化语法。

于 2013-02-19T16:30:02.970 回答
0

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.

于 2013-02-19T06:32:55.270 回答