.htaccess 重定向显示 404.php 文件的绝对路径。如何避免这种情况?

Posted

技术标签:

【中文标题】.htaccess 重定向显示 404.php 文件的绝对路径。如何避免这种情况?【英文标题】:.htaccess redirect is showing absolute path of the 404.php file. How to avoid that? 【发布时间】:2021-05-22 22:39:36 【问题描述】:

我有主域xyz.com,它的主文件夹是/home/username/public_html/

在同一台服务器上,我也有子域sub.xyz.com,它的主文件夹是/home/username/public_html/subfolder/

我正在为子域创建一个网站,并且正在尝试使用 .htaccess 文件进行一些重定向。我已将 404.php 文件放在子域的主目录中。也有用于子域的 .htaccess 文件和 .htpassword 文件。出于此测试的目的,我重命名了主域的 .htaccess 文件,而我的子域的 .htaccess 文件的简化版本如下所示:

ErrorDocument 404 /404.php
RewriteEngine on
RewriteRule ^\. /404.php [R=404,L]

当我写不存在的文件名时,例如sub.xyz.com/non.existing 浏览器中的地址保持不变,我看到的是 404.php 文件的内容。很好。

但是当我写现有的文件名时,例如sub.xyz.com/.htpassword,浏览器中的地址改为:sub.xyz.com/home/username/public_html/subfolder/404.php,这样就暴露了我的目录结构。

奇怪的是,当我编写不存在的文件名sub.xyz.com/.htpasswords 时也会发生同样的情况,但对于不存在的文件名sub.xyz.com/.htpassworsub.xyz.com/.htpassword1 来说一切正常

我应该怎么做才能使现有文件和不存在文件的行为相同?

地址应在所有情况下保持不变,或更改为 sub.xyz.com/404.php 在所有情况下均等。

【问题讨论】:

嗯,这就是你实现的! ErrorDocument 指令负责处理对那些“不存在的文件”的请求并显示该脚本的输出。但是,对于“现有文件”,该指令不匹配,而是您的 RewriteRule 匹配,这 显式 实现了对该脚本的外部重定向。外部重定向会更改浏览器中可见的 URL,因为它重定向浏览器。 嗯,从某种意义上说,这不是我应该做什么的答案,但从某种意义上说,这是我不应该做的答案。它帮助我找到答案并更好地理解语法。 Tnx 没错,这不是答案,根本不是答案,这就是为什么我没有将其作为答案发布,而是作为评论发布的原因。我没有解释你不应该做什么,而是你 做了什么 。至于让你自己前进。因为这里不是给你一个sn-p来复制和粘贴的地方,而是让你了解你在做什么。请注意,您应该能够自己使用您的工具,这是在此处获得帮助的必要条件。我们不是来为您工作,而是帮助您自己解决问题。 问自己这个问题:你为什么要实现RewriteRule?你想用它来达到什么目的? 再次感谢。正如我之前所说,您的评论帮助我自己找到了答案。所以我投了赞成票。我也不知道的是:对 cme​​ts 的支持是否与对答案的支持具有相同的价值,我应该现在写答案还是保持开放? 【参考方案1】:

由于@arkascha 选择不直接给出答案,而是暗示应该改变什么,我要把它写下来。现在,当我知道我在 Apache 文档中“禁止”下的 RewriteRule Flags 页面上找到的问题的确切位置时,我的问题的答案

本例对重写目标使用“-”语法,表示请求的 URI 没有被修改。

所以正确的 .htaccess 部分如下所示:

ErrorDocument 404 /404.php
RewriteEngine on
RewriteRule ^\. - [R=404,L]

这样,URI 保持不变,用户会看到 404.php 文件的内容,就像我想要的那样。

另一个重要通知: 我使用的示例很糟糕,我已将文件 .htpassword 移动到文件夹 public_html 下,但它对于您不想透露其存在的其他文件很有用恶意用户

【讨论】:

我无法理解这个答案:仍然完全不清楚重写规则需要什么......规则匹配模式匹配 staarts 的任何路径文字点(“.”)。我怀疑那会匹配... 我用它来隐藏所有没有名字的文件,所以当我想要隐藏某些东西时,我将它命名为“.config_file”或类似的东西 这看起来有点奇怪...相反,您应该将这些文件保存在您通过 http 服务器发布的服务器端文件系统的部分之外,或者将它们放在您阻止访问的公共文件夹中通过一个单一的、稳健且合理的“拒绝访问”规则。 确实,由于我已将密码文件移至 public_html 文件夹下方,因此我目前不使用该规则。问题是我目前工作的域的 ISP 对于域上强制执行的规则非常不透明。我问过他们并没有得到任何有用的答案。我可以看到 .htaccess 或文件夹 /inc 受到空 .htaccess 文件的保护。问题是我不想依赖它们,因为它们过去更改了配置而没有给我发送通知(而且我也无法更改 ISP)所以我想通过 .htaccess 文件自己保护文件和文件夹. ...所以我也有以下规则RewriteRule ^inc(/.*)? - [R=404,L]。我已经用另一个文件夹名称对其进行了测试,它按预期执行:URI 保持不变,无论文件/文件夹是否存在,用户都会得到 404。

以上是关于.htaccess 重定向显示 404.php 文件的绝对路径。如何避免这种情况?的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 中的 301 重定向错误,显示“Bots Get Naked Version”而不是重定向

使用 htaccess 重定向子域而不更改地址栏中的 URL

重定向.htaccess 301

.htaccess - 尝试强制 https 时出现“重定向过多”

.htaccess 重定向对 Google bot 有啥影响?

Laravel SSL .htaccess 重定向到 index.php