我以前从未见过这种情况,谷歌搜索至今也没有找到任何结果。我几乎可以肯定这是一个愚蠢的错误,我应该看到它,但我就是没有看到。
我有一个非常基本的 Apache 服务器,它运行 PHP,多年来一直运行良好,没有问题。但是,我刚刚发现,如果您%20
在 URL 中的 .php 后面添加 (例如https://www.example.com/index.php%20
),Apache 会将文件作为纯文本提供,而不是提供 404 页面。
我的 php 模块的配置看起来很好,但是当我用谷歌搜索这个问题的时候我真的找不到任何信息。
我的内容/etc/apache2/mods-enabled/php5.conf
<IfModule mod_php5.c>
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps
</IfModule>
Apache 版本为 2.2.22,运行于 Debian Wheezy 上
有谁见过这种情况并且知道我必须调整什么神奇的设置才能阻止 Apache 执行此操作并提供 404 页面?
答案1
尝试一下,用这个替换你当前的:
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
然后重新启动 apache,看看是否能解决问题。我不知道是否能解决问题,我猜不能,但还是试一试,看看,无论如何,这是一个更精确的规则。
但在我看来,Apache 中的某些东西没有正确处理带有空格的 URL,我只是为了看看而在本地系统上进行了测试,当我请求时:
"mysite.com/test.php "
Apache 正确地在内部将其重写为
"mysite.com/test.php"
因此,我相信肯定还有另一种配置不对。但请尝试上述方法,看看是否可行。
确保先注释掉你的东西,然后添加这个。可能与 2.2 有语法差异,因为我运行的是 apache 2.4,如果我没记错的话,debian 配置中存在许多小差异,导致了很多问题,但我不记得它们是什么了。
我相信您可以完全排除 php,问题似乎出在 apache2.2 以及它如何处理 url,我已经安装这个 apache 很长时间了,我知道我既没有添加也没有删除任何会导致这种情况的配置。所以你可能需要非常仔细地检查自安装以来可能所做的任何其他非 php 配置更改。
有一次我在页面上看到未解析形式的 php 代码,这总是由于 php 引擎实际上没有正确配置,但这不是你的情况,因为这只发生在 .php 后的空格处,所以你的 php 本身没问题。
作为一种短期破解,但不是解决方案,您可以制定一个重写规则,非常简单:
RewriteRule ^(.*)([[:space:]]|%20)+$ /$1 [R=301,L]
我无法测试这一点,因为我没有任何无法处理 URL 末尾的空格 /%20 的 apache,也不知道如何实现这一点。
规则很简单,删除行尾的所有空格并转储它们,然后重定向到实际 URL。请注意,可能有更好的方法来执行此操作,再次强调,我从未遇到过这种情况,所以我不知道最佳做法。