htaccess +正则表达式;发送变量+ url重写

时间:2014-10-20 19:47:28

标签: php regex .htaccess

我正在训练我的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

1 个答案:

答案 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">(或您想要的任何其他语法)。只要您使用适当的重写规则备份它们,重写引擎将处理到达这些地址的请求,并将这些请求发送到您的最终脚本。