我正在训练我的htacces +正则表达式技巧,在理论上学习了一两个月,并想在实践中给它一个机会。
所以问题是我有一个名为index.php的文件,其代码如下:
<html>
<head>
</head>
<body>
<a href="2var.php?var1=one&var2=two">2var test</a><!--2var.php/one/two-->
</body>
</html>
和第二个名为2var.php的文件,其中包含以下代码:
<?php
if($_GET["var1"] && $_GET["var2"])
{
echo "both rechead";
}
else
{
if($_GET["var1"] || $_GET["var2"])
echo "one of them reached";
else
echo "neither reached";
}
?>
所以,我想要做的是测试我是否可以同时发送变量和编辑网址(我一直在阅读这是可能的,这正是幕后“正在发生的事情”)。但我无法获得正确的思维方式或完成此任务的专业知识。
顺便说一句:
DirectoryIndex index.html index.php
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^\/?([a-z]+)\/([a-z]+).html$ 2var.php?var1=$1&var2=$2
我的意思是这样做 2var.php / one / two 并且实际传递变量。现在我只接受“既未达到”;
编辑:我在localhost中,所以漏洞链接是localhost / tests / index.php ||本地主机/测试/ var2.php VAR1 = $ 1和; VAR2 = $ 16
答案 0 :(得分:1)
你说你想抓住2var.php/one/two
。
问题是2var.php
已经是一个PHP脚本了,实际上你并不需要RewriteEngine。如果您尝试使用RewriteEngine访问脚本并禁用其规则,它将起作用,但会产生有关未定义索引的警告:var1
。
这是因为/one/two
无法访问$_GET
部分。相反,它存储在名为$_SERVER['PATH_INFO']
的变量中。
示例 - 访问/test/2var.php/one/two
之类的网址,同时2var.php
包含以下内容:
<?php
var_dump($_SERVER['PATH_INFO']);
将输出以下内容:
string(8) "/one/two"
您可以使用脚本本身的正则表达式解析它。
关于实际的.htaccess规则。你几乎把它们搞定了。但是,您从^
开始,这会导致URL完全匹配/one/two.html
形式的字符串。由于这些匹配针对完整请求URI发生,请继续尝试查看如果将^
替换为2var.php
会发生什么情况并删除.html
部分,以便您的RewriteRule看起来像这样:
RewriteRule 2var.php\/?([a-z]+)\/([a-z]+)$ 2var.php?var1=$1&var2=$2
注意缺少^
。这意味着您可以将2var
放在服务器上的任何目录中,它仍然有效。
另外,我注意到您链接到<a href="2var.php?var1=one&var2=two">
。重写规则的目的是使URL漂亮,因此您可以直接链接到<a href="2var.php/one/two">
(或您想要的任何其他语法)。只要您使用适当的重写规则备份它们,重写引擎将处理到达这些地址的请求,并将这些请求发送到您的最终脚本。