我的目标是降低应用签名的可见性。这不是默默无闻的安全,只是一种表面的深度防御,因此攻击者乍一看无法判断它是否是静态站点。 (也是为了美观;隐藏应用程序详细信息只是感觉“更干净”,即使它们在正常操作中永远不会可见)。因此,我想拒绝访问某些目录而不透露它们的存在,因此我必须给出与我的应用程序在用户请求不存在的页面时给出的完全相同的 404 响应。
在 .htaccess
文件中,我有以下内容:
RewriteEngine on
RewriteCond "%{REQUEST_FILENAME}" "!-f"
RewriteCond "%{REQUEST_FILENAME}" "!-d"
RewriteRule "^(.*)" "index.php?page=$1"
RewriteRule "^(secret_dir1|secret_dir2)(/.*)?$" "index.php?page=404"
其中index.php
根据“page”GET参数的值呈现一个漂亮的网页;如果“page”与应用级别的页面不对应,或者“page”设置为 404,则脚本会呈现一个漂亮的 404 页面,其中包含正确的标题和所有内容。
这就是问题发生的地方。 “应用程序级”404 按预期工作;呈现 404 页面。但是,如果用户请求 mydomain.com/dir_i_am_trying_to_hide
,他们会收到 301 重定向到 mydomain.com/dir_i_am_trying_to_hide/?page=404
:外部重定向而不是外部重定向内部重写。
为什么它发送外部重定向而不是仅仅重写 URL?我该如何正确避免这种情况?除此之外,有没有办法强制服务器进行内部重写? (Apache 文档似乎表明您可以强制 RewriteRule 为外部的,但反之则不然)
最佳答案
事实证明我的重写规则没有导致外部重定向; Apache 的 DirectorySlash
是;我会查询hostname/secret_dir1
,它会发送重定向到hostname/secret_dir1/
。
我不确定为什么查询字符串被更改,但添加 DirectorySlash off
修复了它。
关于apache - mod_rewrite 强制内部重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39383019/