首页 > 解决方案 > 如何将 REQUEST_URI 从 htaccess 传递给 PHP

问题描述

我正在设置一个重定向 URL,从该 URL 传递REQUEST_URI.htaccessPHP 文件。

这是我的文件结构:

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

我想从 to 传递完整%{REQUEST_URI}的 URL并使用..htaccessfolder/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>

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

标签: php.htaccessmod-rewrite

解决方案


我想从 to 传递完整%{REQUEST_URI}的 URL并使用..htaccessfolder/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)。该值未进行 % 解码。

如果您确实想REQUEST_URI在 PHP 中引用 Apache 服务器变量,那么您需要显式传递它(可能作为环境变量或查询字符串) - 但取决于您何时“传递它”,您最终可能会传递不同的值。无论哪种方式,这都不会改变 的值$_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.phpindex.php

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


推荐阅读