mod_rewrite强制内部重定向

时间:2016-09-08 05:13:32

标签: apache .htaccess redirect mod-rewrite

我的目标是降低应用程序签名的可见性。这不是默默无闻的安全,只是表面上的一点点防御,所以乍一看攻击者无法判断它是否是一个静态站点。 (也是装饰性的;它只是感觉"更清洁"隐藏应用程序细节,即使它们在正常操作中永远不会变得可见)。因此,我想拒绝访问某些目录而不会泄露它们存在,所以如果用户请求不存在的页面,我必须给出我的应用程序提供的完全相同的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为外部,但不是相反)

1 个答案:

答案 0 :(得分:3)

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

我不确定为什么查询字符串已更改,但添加DirectorySlash off已修复它。