apache - mod_rewrite 强制内部重定向

标签 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根据“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/

相关文章:

php - 如果找不到,我们如何使用 Apache 重定向到新的 HTML 静态内容并回退到旧的基于 CMS 的 PHP 版本? (nginx try_files)

javascript - 使用正则表达式删除 £ 符号将 URL 重定向到 Paypal Me

apache - 来自其他站点的错误 url ?fb_xd_fragment= redirect

.htaccess - 为什么此 RedirectMatch 301 会替换 & 符号?

apache - EC2 中的 http 到 https AWS 中的 apache2

linux - 服务器上每个域的邮件客户端配置

php - UTF-8贯穿始终

apache - htaccess - 拒绝来自未授权域的请求

php - 使用 .htaccess 创建 SEO 网址

重定向至 Shopify 客户注册处的结帐页面