1

最近,我正在试验 PHP 的 mod_rewrite 引擎。我读过的一堆教程让我很好地了解了如何使用它最基本和最有用的可能性。但是仍然有那个问题我没有找到答案。我想这应该是第一个要解释的问题,但还没有教程给我答案。

我想知道在尝试匹配正则表达式时正在考虑URL 的哪一部分。

假设my_project我的服务器上有一个目录,并且.htaccess该目录中有一个文件。浏览器应该看到这样的目录:

http://my_website.com/my_project

如果我在其中添加一条规则,.htaccess那么在尝试匹配该规则的正则表达式时将考虑上述 URL 的哪一部分?我很擅长理解正则表达式本身,但我无法弄清楚 mod_rewrite 选择哪个 URL 块来执行正则表达式。

如果我的问题不够清楚,让我也这样说:上述 URL 的哪个确切位置与以下正则表达式匹配.htaccess

^

还有一个问题,如果我去

http://my_website.com/my_project/subfolder

URL 的考虑部分是否会有所不同,或者它将始终取决于放置的.htaccess位置?

4

2 回答 2

2

我想到了。
为了解释这个问题以及我是如何得到答案的,我将尝试一步一步地解释它。
让我们假设以下内容:

.htaccess被放置在my_project根路径下的文件夹中www.my_website.com.htaccess包含以下规则:

RewriteRule ^.*$ index.php?matched=$0

为了避免无限循环,我们只有在查询字符串中提供测试参数时才“触发”规则,所以完整.htaccess应该如下所示:

RewriteEngine On
RewriteCond %{QUERY_STRING} test=1
RewriteRule ^.*$ index.php?matched=$0

现在,如果一切都按我的想法进行,我们应该将index.php脚本放在my_project文件夹中。要查看整个比赛,让我们将以下行添加到脚本中:

var_dump($_GET["matched"]);

在我们进入的浏览器中http://my_website.com/my_project?test=1,我们期望输出是:

string(32) "http://my_website.com/my_project"

但事实并非如此!而是

string(0) ""

我们快要到了。现在让我们去http://my_website.com/my_project/subfolder/?test=1。输出是

string(10) "subfolder/"

这证明了一件事 - 当 mod_rewrite 开始将 URL 与正则表达式进行比较时,它看不到PROTOCOLURL 的部分以及HTTP_HOST部分。正如我进一步的研究所揭示的,它还省略了该.htaccess位置上方的每个文件夹以及 URL 的查询字符串和哈希部分。对于 mod_rewrite,URL 从位置开始的.htaccess地方开始。

我希望这个自我回答的问题对将来的某人有所帮助。

享受!

于 2013-09-21T14:08:19.793 回答
0

让我给你一个实际的例子

假设您的网站是 www.example.com,它位于名为“ex”的文件夹/目录中,您将 .htaccess 文件放在您的 ex 文件夹中,以使其适用于您的网站 www.example.com

现在假设你想让这个 url 干净 www.example.com/ex/index.php?page=welcome

打开您放置在 ex 文件夹中的 your.htaccess 文件,并将以下代码添加到其中

 RewriteEngine On
 RewriteRule    ^([A-Za-z0-9-+_%*?]+)/?$    index.php?page=$1     [L]

它会将 URL 从 www.example.com/ex/index.php?page=welcome 更改为 www.example.com/ex/welcome

现在假设您将您的网站移动到子文件夹 ex/subfolder 或 www.example.com/ex 到 www.example.com/ex/subfolder

只需将包含所有站点的 .htaccess 文件移动到该子文件夹即可,无需更改代码它的工作方式相同

([A-Za-z0-9-+_%*?]+) <-- 括号中的这部分用作正则表达式意味着您正在寻找从 A 到 z 和从 a 到 z 的任何字符从 0 到 9 的数字和符号 - , +,_,%,*,? 右方括号后的 + 号表示多个 .

简而言之,您要的是 ([in here]+) 并且不止一个,但是如果您删除括号后的 + 符号,它将仅返回第一个字符

于 2013-09-21T12:56:10.103 回答