Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mod rewrite和带有参数的完整url_Php_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Php mod rewrite和带有参数的完整url

Php mod rewrite和带有参数的完整url,php,regex,apache,.htaccess,mod-rewrite,Php,Regex,Apache,.htaccess,Mod Rewrite,我想得到完整的url和index.php的参数,用mod_rewrite重写 .htaccess RewriteEngine On RewriteBase / RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d RewriteRule (.*)$ index.php?q=$1 [L,QSA] index.php仅适用于 print_r($_

我想得到完整的url和index.php的参数,用mod_rewrite重写

.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule (.*)$ index.php?q=$1 [L,QSA]
index.php仅适用于

print_r($_GET);
当我尝试

domain.tld/http://asdf/asdf&s=1%3fb=3&c=34
我明白了

但我需要这样的东西:

Array
(
    [q] => http://asdf/asdf&s=1%3fb=3&c=34 //some complicated url
)
有(简单的)方法吗?我找到了许多针对不同参数的解决方案,而不是针对一体机的解决方案。
对不起,我的英文是:)

问题是,在您的示例URI中,查询字符串的格式不正确,导致Apache将字符串的一部分
(以
&s=…`开头的部分)解释为查询字符串

本质上,这意味着Apache将其视为输入:

URI => http://asdf/asdf
Query String => s=1%3fb=3&c=34
重定向规则只对URI部分进行操作,然后通过
QSA
标志附加查询字符串,因此您可以得到如下内容作为重写请求:

index.php?q=http://asdf/asdf&s=1%3fb=3&c=34
您需要首先对查询字符串进行URL编码。例如,这可能类似于由以下内容生成的内容:

$query_string = urlencode('http://asdf/asdf&s=1?b=3&c=34');
然后,为了防止Apache对其重新编码(双重编码),请在重定向规则中使用
NE
标志:

RewriteRule (.*)$ index.php?q=$1 [L,NE,QSA]

问题是,在您的示例URI中,查询字符串的格式不正确,导致Apache将字符串的一部分
(该部分以
&s=…`开头)解释为查询字符串

本质上,这意味着Apache将其视为输入:

URI => http://asdf/asdf
Query String => s=1%3fb=3&c=34
重定向规则只对URI部分进行操作,然后通过
QSA
标志附加查询字符串,因此您可以得到如下内容作为重写请求:

index.php?q=http://asdf/asdf&s=1%3fb=3&c=34
您需要首先对查询字符串进行URL编码。例如,这可能类似于由以下内容生成的内容:

$query_string = urlencode('http://asdf/asdf&s=1?b=3&c=34');
然后,为了防止Apache对其重新编码(双重编码),请在重定向规则中使用
NE
标志:

RewriteRule (.*)$ index.php?q=$1 [L,NE,QSA]

您可以在根目录中使用此规则。htaccess:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} \s/+(\S+)
RewriteRule ^ /index.php?q=%1 [B,L]

您可以在根目录中使用此规则。htaccess:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{THE_REQUEST} \s/+(\S+)
RewriteRule ^ /index.php?q=%1 [B,L]

我忘了:url来自互联网-我不知道我得到了什么。我忘了:url来自互联网,我不知道我得到了什么。所以urlencode是没有用的。仅供参考,这个问题非常棘手,
%{THE_REQUEST}
和flag
B
在这里扮演着非常重要的角色。仅供参考,这个问题非常棘手,
%{THE_REQUEST}
和flag
B
在这里扮演着非常重要的角色。