如何将htaccess的REQUEST_URI传递给PHP

时间:2018-12-20 21:48:05

标签: php .htaccess mod-rewrite

我正在设置重定向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,但始终将其提供给外部服务器。

2 个答案:

答案 0 :(得分: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,则需要显式传递它(也许作为环境变量或查询字符串)-但是取决于何时您“传递”,最终可能传递不同的值。无论哪种方式,都不会更改$_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']即可访问查询字符串(重定向到的字符串)。

答案 1 :(得分:0)

使用环境变量。

.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