mod_rewrite搜索开始的地方?

时间:2013-09-21 12:42:01

标签: regex apache .htaccess mod-rewrite

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

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

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

http://my_website.com/my_project

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

如果我的问题不够明确,请允许我这样说:上述网址的哪个确切位置与.htaccess中的以下正则表达相匹配?

^

还有一个问题,如果我去

http://my_website.com/my_project/subfolder

网址的考虑部分是否会有所不同,或者总是取决于.htaccess所在的位置?

2 个答案:

答案 0 :(得分:2)

我明白了。
为了解释这个问题以及我如何得到答案,我将逐步解释它 我们假设如下:

.htaccess位于my_project根路径中的www.my_website.com文件夹中。 .htaccess包含以下规则:

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

为了避免无限循环,只有当我们在查询字符串中提供 test 参数时才让“触发”规则,因此完整的.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与正则表达式进行比较时,它不会看到URL的PROTOCOL部分以及HTTP_HOST部分。正如我的进一步研究所揭示的,它还省略了.htaccess位置上方的每个文件夹以及URL的查询字符串和哈希部分。对于mod_rewrite,URL从.htaccess位置开始的位置开始。

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

享受!

答案 1 :(得分:0)

让我举一个实际的例子

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

现在让我们假设您要将此网址清理干净www.example.com/ex/index.php?page=welcome

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

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

它会将网址从www.example.com/ex/index.php?page=welcome转到www.example.com/ex/welcome

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

只需将.htaccess文件与您的所有网站一起移动到该子文件夹,无需更改代码,它将工作相同

([A-Za-z0-9 - + _%*?] +)< - 括号内的这一部分用作正则表达式 意味着你正在寻找从A到z和从a到z的任何字符以及从0到9的任何数字和符号 - ,+,_,%,*,?关闭方括号后面的+号表示不止一个。

简而言之,你要问的是([在这里] +)并且它不止一个,如果你删除了括号之后的+符号它只会返回第一个字符