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