如何解决Apache 上 PHP 中奇怪的 URL 匹配行为 MCVE
TL;DR
如果我有一个 /campaign.PHP
文件 /campaign/some-url-stuff
匹配它而不是使用 .htaccess
中的重写规则
我刚刚为复活节活动制作了一个脚本并将其命名为 campaign.PHP
我将其设置为处理 GET
参数 name
所以示例 URL:https://localhost/campaign.PHP?name=Easter2021
>
然后我转到我的 .htaccess
文件(Windows 上的 apache 2.4)并在其中创建了一行:
RewriteRule ^campaign/(.+)$ /campaign.PHP?name=$1 [L]
使用 this debugger 进行验证,使用以下 URL 调用它是正确的:https://localhost/campaign/Easter2021
MCVE
<?PHP
$campaignName = filter_input(INPUT_GET,'name',FILTER_SANITIZE_STRING);
if ($campaignName == 'Easter2021') {
echo "OK";
} else {
header("content-type text/plain");
echo "Invalid campaign Requested [$campaignName]";
print_r($_GET);
}
因此,如果我的文件与漂亮 URL 的根名称相同,则似乎是在调用它,并且规则不匹配,这意味着我没有获得 name
GET 参数。
print_r($_GET);
返回 Array ( )
但如果我重命名文件并将我的 .htaccess
更新为:RewriteRule ^campaign/(.+)$ /campaignHandler.PHP?name=$1 [L]
然后 https://localhost/campaign/sdfdsfsdf
给 Array ( [name] => sdfdsfsdf )
问题是:为什么?我可以做些什么来避免将来发生这种情况? (必须有一些 PHP/apache 配置来解决这个问题)
解决方法
在思考这个问题并练习了一些 Google fu 之后,我偶然发现了关于 SO 的 this question。
罪魁祸首是 Apache httpd's Multiview 功能,如果不存在具有所要求名称的文件,则会查看服务器上存在的文件的基本名称,并改为提供其中之一。
将 Options -Multiviews
添加到 .htaccess
文件可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。