【问题标题】:How to pass REQUEST_URI from htaccess to PHP如何将 REQUEST_URI 从 htaccess 传递给 PHP
【发布时间】:2019-05-21 10:28:52
【问题描述】:

我正在设置一个重定向 URL,将 REQUEST_URI.htaccess 传递到 PHP 文件。

这是我的文件结构:

  • index.php
  • .htaccess
  • folder/index.php

如果网址是http://example.com/?something

我想将 %{REQUEST_URI} 的完整 URL 从 .htaccess 传递到 folder/index.php 并使用 $_SERVER['REQUEST_URI'] 检索它。

我的folder/index.php

echo $_SERVER['REQUEST_URI'];

.htaccess:

更新:

Options +FollowSymLinks -MultiViews
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteCond %{REQUEST_URI} !/folder/index.php$
    RewriteRule .* /folder/index.php [L,NE]
</IfModule>

我希望在 PHP 文件中回显REQUEST_URI,但总是提供外部服务器。

【问题讨论】:

  • “它总是给外部服务器是什么意思?
  • 当键入 mydomain.com/?something 时,它会提供 500 个外部服务器页面,而不是将 REQUEST_URI 从 htaccess 传递到 php 文件。
  • 通常您不需要 .htaccess 来获取该变量值。 $_SERVER["REQUEST_URI"] 明白了。只需将包含该指令的脚本放在 /public_html 或类似目录中

标签: php .htaccess mod-rewrite


【解决方案1】:

我想将 %{REQUEST_URI} 的完整 URL 从 .htaccess 传递到 folder/index.php 并使用 $_SERVER['REQUEST_URI'] 检索它。

你实际上不能这样做(但我不认为这是你想要做的 - 或者甚至不是想要做的 - 无论如何)。澄清一下……

PHP 超全局 $_SERVER['REQUEST_URI'] 由 PHP 填充,不能被覆盖。

虽然%{REQUEST_URI}(Apache 服务器变量)和$_SERVER['REQUEST_URI'](PHP 超全局变量)相似,但它们引用不同的值:

  • %{REQUEST_URI}(Apache 服务器变量)- 仅引用 URL 路径(无查询字符串)。该值是 % 解码的。如果请求被重写,则更新它以包含重写的 URL,而不是初始请求的 URL。

  • $_SERVER['REQUEST_URI'](PHP 超全局)- 保存用户请求的初始 URL 路径 查询字符串(不是重写的 URL)。该值未进行 % 解码。

如果您确实想在 PHP 中引用 Apache 服务器变量 REQUEST_URI,那么您需要显式传递它(可能作为环境变量或查询字符串) - 但取决于 when 您“通过它”,您最终可能会传递不同的值。无论哪种方式,这都不会改变$_SERVER['REQUEST_URI'] 的值,如上所述,它是由 PHP 控制的。

例如:

RewriteRule ^ - [E=APACHE_REQUEST_URI:%{REQUEST_URI}]

并在 PHP 中将其引用为 getenv('APACHE_REQUEST_URI')


更新:

听上去,你可能想要类似下面的东西:

RewriteCond %{QUERY_STRING} .
RewriteRule ^(index\.php)?$ folder/index.php [L,NE]

内部重写对文档根的任何请求,其中包含查询字符串? 之后的所有内容)到/folder/index.php。当查询字符串不存在时,文档根目录中的index.php 将正常提供。

然后,在/folder/index.php 中,您只需访问$_SERVER['QUERY_STRING'] 即可访问查询字符串(要重定向到的字符串)。

【讨论】:

  • “我尝试了你的代码,但没有用” - 我发布的代码确实 工作,但它并不是为了解决你的具体问题。这听起来像XY problem?你实际上想要做什么? “我想将完整的 $_SERVER['REQUEST_URI'] 传递给我的 PHP 文件”——这没有意义。正如我上面所说,这是由 PHP 自动生成的,没有什么可以“通过”的吗?并且无需解析它来获取“? 之后的 url”——这称为 查询字符串,并且已经存在于 PHP 超全局 $_SERVER['QUERY_STRING'] 中。
  • 我想我得到了你想要的。我已经更新了我的答案。 (询问通过 REQUEST_URI 似乎是red herring。)
  • 很高兴它有效,不客气。请将其标记为“已接受”(投票箭头下方的复选标记)以将其从未回答的问题队列中删除。您还可以为您认为有用的答案投票。
  • 但这是正确的吗?然后,您将使用 parse_url($_SERVER['REQUEST_URI'],PHP_URL_QUERY);substr(strstr($_SERVER['REQUEST_URI'],'?'),1); 之类的内容提取查询字符串 - 两者都会产生相同的结果,例如。 http://google.com.
  • 是的,您的代码现在可以正常工作了,非常感谢您的帮助 :)
【解决方案2】:

使用环境变量。

.htaccess
SetEnv RURI %{REQUEST_URI}
index.php
<?php $requestURI = getenv('RURI'); ?>

Set an environment variable in .htaccess and retrieve it in PHP

确保在 Apache 中启用 mod_env

【讨论】:

  • 经过测试但不起作用,你必须知道我在主 index.php 中使用 ?something 而不是文件夹/index.php 我认为我这样做的方式是 50% 正确但不要知道缺少什么才能使其充分发挥作用。
  • 尝试将SetEnv 放在RewriteCond 之前。
  • 对不起,但不起作用。有什么方法可以使用 $_SERVER['REQUEST_URI'] 在我的 php 文件夹/index.php 中获取它?
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多