最近,我正在尝试使用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
所在的位置?
答案 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的任何数字和符号 - ,+,_,%,*,?关闭方括号后面的+号表示不止一个。
简而言之,你要问的是([在这里] +)并且它不止一个,如果你删除了括号之后的+符号它只会返回第一个字符