微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache 上 PHP 中奇怪的 URL 匹配行为 MCVE

如何解决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/sdfdsfsdfArray ( [name] => sdfdsfsdf )

问题是:为什么?我可以做些什么来避免将来发生这种情况? (必须有一些 PHP/apache 配置来解决这个问题)

解决方法

在思考这个问题并练习了一些 Google fu 之后,我偶然发现了关于 SO 的 this question
罪魁祸首是 Apache httpd's Multiview 功能,如果不存在具有所要求名称的文件,则会查看服务器上存在的文件的基本名称,并改为提供其中之一。

Options -Multiviews 添加到 .htaccess 文件可以解决问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。