PHP 如何通过规则或 htaccess 获取可见的查询字符串而不是解析的查询字符串

How to get visible query string and not parsed query string by rules or htaccess in PHP

我有一个url,一部分是通过htaccess转成变量,一部分是GET发送的变量。

mydomain.com/page/5/string?v2=foo&v3=bar

.httaccess 发送 5 作为变量,我们称它为 v1

RewriteRule ^([^/]*)/([0-9]+)/(.*)$ page.php?v1= [L,QSA]

查询字符串的其余部分作为 GET 接收。

?v2=foo&v3=bar

这个例子很直接,但是在实际系统中.htaccess解析的变量不止一个,而且是动态的,

我需要找到一种方法来只获取 GET 中发送的变量,而忽略来自 .htaccess 的变量。

我试过 $_SERVER['QUERY_STRING'] 但那个 returns 也是 .htaccess 解析的变量:

echo $_SERVER['QUERY_STRING'] //returns v1=5&v2=foo&v3=bar

我只想得到v2=foo&v3=bar

我认为您可以阅读 $_SERVER['REQUEST_URI'] 并使用正确的正则表达式从 URL 获取 GET 变量。然后(如果需要)您可以编写函数将它们拆分为变量数组:

$get = array(); //array for GET values
$uri = $_SERVER['REQUEST_URI'];

$uri_parts = explode('?', $uri, 2);
$get_string = $uri_parts[1]; //[0] is address

$get_pairs = explode('&', $get_string); //split to key=value pairs
foreach($get_pairs as $get_pair){
  list($key, $value) = explode('=', $get_pair, 2); //split key and value
  $get[$key] = $value;
}

$get_string 包含类似 a=bc&d=ef

的字符串

$get 包含键值对(如 $_GET

例子

SetEnv SPECIAL_PATH /foo/bin

http://httpd.apache.org/docs/current/mod/mod_env.html#setenv

I need to find a way to only get the variables sent in GET ignoring the ones from .htaccess.

您可以使用环境变量将原始查询字符串传递到您的 php 文件:

RewriteRule ^([^/]+)/([0-9]+)/(.*)$ page.php?v1= [E=qs:%{QUERY_STRING},L,QSA]

现在在 php 代码中使用此变量访问原始查询字符串:

$_SERVER["REDIRECT_qs"]

这应该打印:

v2=foo&v3=bar

$_SERVER["QUERY_STRING"] 将为您提供完整的查询字符串,即 v1=5&v2=foo&v3=bar