2016-09-08 42 views
1

我的目标是降低我应用程序签名的可见性。这并非默默无闻,而仅仅是深度防御的浅薄表现,因此乍一看攻击者无法判断它是否为静态站点。 (也是美容;即使在正常操作中它们永远不会变得可见,它只是觉得“更清洁”以隐藏应用细节)。因此,我想拒绝访问某些目录而不透露它们存在,因此如果用户请求不存在的页面,我必须给出与应用程序相同的404响应。mod_rewrite强制内部重定向

.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参数;如果“页面”与应用程序级别的页面不对应,或者“页面”设置为404,则该脚本将呈现具有适当标题和所有内容的漂亮404页面。

这是问题发生的地方。 “应用程序级”404s按预期工作;一个404页面被渲染。但是,如果用户请求mydomain.com/dir_i_am_trying_to_hide,他们会得到301重定向到mydomain.com/dir_i_am_trying_to_hide/?page=404:外部重定向而不是内部重写。

它为什么发出一个外部重定向而不是只重写url?我该如何正确地避免这种情况?除此之外,是否有强制服务器执行内部重写的方法? (Apache的文档似乎表明你可以强制重写规则是外部的,但不是相反的方式)

+0

要清楚,'^ dir_i_am_trying_to_hide'不是真正的正则表达式:D – dn3s

+0

这些规则不应该导致301.也许你的index.php里面有一些东西在做它? –

+0

我无法想象什么。我只在整个应用程序中调用了header()函数,这是'header(“$ {_ SERVER [”SERVER_PROTOCOL“]} 404 Not Found”);'在呈现404页面之前。 – dn3s

回答

2

原来我的重写规则没有导致外部重定向; Apache的DirectorySlash是;我会查询hostname/secret_dir1,它会发送一个重定向到hostname/secret_dir1/

我不知道为什么查询字符串被更改,但添加DirectorySlash off修复了它。