【问题标题】:Apache's mod_rewrite and %{REQUEST_URI} problemApache 的 mod_rewrite 和 %{REQUEST_URI} 问题
【发布时间】:2009-08-01 20:25:00
【问题描述】:

假设我们有以下 PHP 页面“index.php”:

<?
if (!isset($_GET['req'])) $_GET['req'] = "null";
echo $_SERVER['REQUEST_URI'] . "<br>" . $_GET['req'];
?>

以及以下“.htaccess”文件:

RewriteRule ^2.php$ index.php?req=%{REQUEST_URI}
RewriteRule ^1.php$ 2.php

现在,让我们访问“index.php”。我们得到这个:

/index.php
null

这很酷。让我们访问“2.php”。我们得到这个:

/2.php
/2.php

这也很酷。但是现在让我们看看“1.php”:

/1.php
/2.php

所以...我们要求“1.php”,它会默默地重定向到“2.php”,它会默默地重定向到“index.php?req=%{REQUEST_URI}”,但这里是“%{REQUEST_URI} " 似乎是 "2.php" (我们在 第一次重定向之后寻找的页面)并且 $_SERVER['REQUEST_URI'] 是 "1.php" (原始请求)。

这些变量不应该相等吗?这让我今天很头疼,因为我试图仅基于 original 请求进行重定向。我可以在“.htaccess”中使用任何变量,即使在重定向之后也会告诉我原始请求?

提前谢谢,我希望我已经说清楚了。这是我在这里的第一篇文章:)

【问题讨论】:

    标签: php apache mod-rewrite request


    【解决方案1】:

    我不确定它是否能满足您的需求,但请先尝试查看REDIRECT_REQUEST_URI,如果不存在,请查看REQUEST_URI。您在对 Gumbo 的回答的评论中提到,您真正要寻找的是原始 URI; REDIRECT_* 版本的服务器变量是 Apache 尝试使这类东西可用的方式。

    【讨论】:

    • 不幸的是,添加 [PT] 修饰符没有任何区别。
    【解决方案2】:

    只需更改规则的顺序即可:

    RewriteRule ^1\.php$ 2.php
    RewriteRule ^2\.php$ index.php?req=%{REQUEST_URI}
    

    或者只使用一个规则:

    RewriteRule ^(1|2)\.php$ index.php?req=%{REQUEST_URI}
    

    【讨论】:

    • 是的,我想这适用于我发布的示例,尽管我宁愿寻找一个变量,即使在一个或多个重定向之后也可以告诉我原始请求。
    【解决方案3】:

    好吧,我想我解决了这个问题。我使用了 %{THE_REQUEST} 变量,它基本上包含如下内容:“GET /123.php HTTP/1.1”。即使在重定向之后它仍然保持不变。感谢大家的帮助! :)

    【讨论】:

    • 你为什么不直接使用$_SERVER['REQUEST_URI']
    • 我需要在 .htaccess 中使用变量,而不是在 PHP 中。正如我在第一篇文章中提到的,%{REQUEST_URI} 不包含重定向/重写后的原始请求。
    猜你喜欢
    • 2011-08-06
    • 2017-03-23
    • 1970-01-01
    • 2014-09-20
    • 2012-02-16
    • 2015-03-31
    • 2013-09-08
    • 2011-03-03
    相关资源
    最近更新 更多