gpt4 book ai didi

php - 为什么 Apache RewriteRule 对 '&' 和 '?' 的处理方式相同

转载 作者:行者123 更新时间:2023-12-04 07:44:21 25 4
gpt4 key购买 nike

我正在尝试为 Apache 网络服务器中的“.htaccess”文件编写自定义重写规则。
主要思想是处理以下形式的请求:

example.com/foo
到 www_root 中的“index.php”文件:
example.com/index.php?queryString1=foo
众所周知,这很容易做到。只需在“.htaccess”文件中添加以下几行:
RewriteEngine on
RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI} !-l
RewriteRule ^(.*)$ index.php?queryString1=$1 [QSA,L]
但问题是当我们想向请求中添加另一个查询字符串时,例如如下:
example.com/foo?queryString2=bar&queryString3=baz
出乎我的意料,下面的 URL 做同样的事情:
example.com/foo&queryString2=bar&queryString3=baz
我不希望执行第二种情况(其中第二个查询字符串以 '&' 开头)。
另外,如果你在 'index.php' 文件中写:
<?php echo '<pre>'.print_r($_SERVER['QUERY_STRING'], TRUE).'</pre>'; ?>
然后,两个 URL( example.com/foo?queryString2=bar&queryString3=bazexample.com/foo&queryString2=bar&queryString3=baz )的输出将是唯一的:
queryString1=foo&queryString2=bar&queryString3=baz
谁能解释我在“.htaccess”文件中的代码有什么问题?谢谢。

最佳答案

经过上面的讨论,apache2 不处理 & 和 ?以同样的方式。 “?”是来自 QUERY_STRING 的 URL 的分隔符,但 & 是作为 apache2 RewriteRule 匹配的 URL 的一部分的普通字符。
https://www.example.com/URL?QUERY_STRING 的模式, URL 只被 .htaccess 文件中的 RewriteRule 匹配,如果给定,它是主机名和端口之后的字符串,查询字符串之前的字符串 ref. , 没有前导斜杠/。
小心,在 apache2 配置文件 vhosts.conf 或类似文件中,读取 apache2 服务器启动时,RewriteRule mathches 对 /URL字符串(是的,带前导斜杠)。
OP的案例只是一个机会,而不是一般规则。我已经通过触发 404 Not Found 对此解决方案进行了测试。如果 & 包含在 URL 中,则会出错:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([^&]*)$ index.php?queryString1=$1 [QSA,L]
example.com/foo&queryString2=bar&queryString3=baz将产生 404 错误。 %{REQUEST_FILENAME}优于 %{REQUEST_URI} .
字符范围 [^&] 表示除 & 以外的任何字符。使用正则表达式 ^([^&]*)$,我们选择一个不包含 & 的字符串,从开始由 ^ 表示,到由 $ 表示的结束,所以 & 符号免费。

关于php - 为什么 Apache RewriteRule 对 '&' 和 '?' 的处理方式相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67272088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com