我的目标是降低应用程序签名的可见性。这不是默默无闻的安全,只是表面上的一点点防御,所以乍一看攻击者无法判断它是否是一个静态站点。 (也是装饰性的;它只是感觉"更清洁"隐藏应用程序细节,即使它们在正常操作中永远不会变得可见)。因此,我想拒绝访问某些目录而不会泄露它们存在,所以如果用户请求不存在的页面,我必须给出我的应用程序提供的完全相同的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
根据"页面"的值呈现漂亮漂亮的网页。 GET参数;如果"页面"与应用级别的页面不对应,或者" page"设置为404,脚本呈现一个漂亮的404页面,其中包含正确的标题和所有内容。
问题发生在哪里。 "应用程序级" 404s按预期工作;呈现404页面。但是,如果用户请求mydomain.com/dir_i_am_trying_to_hide
,则会向他们提供301重定向到mydomain.com/dir_i_am_trying_to_hide/?page=404
:外部重定向而不是内部重写。
为什么发送外部重定向而不是仅重写网址?我该如何正确避免这种情况?除此之外,是否有办法强制服务器进行内部重写? (Apache文档似乎表明你可以强制RewriteRule为外部,但不是相反)
答案 0 :(得分:3)
原来我的重写规则没有导致外部重定向; Apache的DirectorySlash
是;我会查询hostname/secret_dir1
,它会将重定向发送到hostname/secret_dir1/
。
我不确定为什么查询字符串已更改,但添加DirectorySlash off
已修复它。