使用 .htaccess 将一个文件夹重定向到另一个文件夹,但保留原始 URL 并阻止对所有其他文件夹的访问

问题描述 投票:0回答:1

tl;dr 如何使用 Apache 中的

.htaccess
文件将
http://test.lab.example.com/mech-platform/
(不存在的文件夹)重定向到 http://test.lab.example.com/mech-platform-web/frontend/web/(现有文件夹),以便用户仍然在浏览器中看到原始 URL,无法访问该服务器上的任何其他内容,并且此类重定向不是永久的(浏览器未缓存)?


问题

我有一个 test.lab.example.com 域,它指向一个 IP 地址,该 IP 地址又指向我的 Apache 安装中的

htdocs
文件夹。我有一个现有文件夹
mech-platform-web/frontend/web
,它是我的应用程序可通过网络访问的入口文件夹。

我想在该域中使用“假”(不存在)文件夹或 URL 部分:

http://test.lab.example.com/mech-platform/

指向上述文件夹:

http://test.lab.example.com/mech-platform-web/frontend/web/

web
文件夹中的所有文件、所有子文件夹和URL的子部分以及所有查询项都必须重写和处理。此可通过 Web 访问的文件夹之上的任何其他文件夹或文件都必须是可访问的。

最终用户应该看不到重定向或重写。例如,所有对“假”URL/文件夹的调用:

http://test.lab.example.com/mech-platform/device/edit/1
http://test.lab.example.com/mech-platform/index.php?device=1&op=edit

必须在现有的基础上进行处理:

http://test.lab.example.com/mech-platform-web/frontend/web/device/edit/1
http://test.lab.example.com/mech-platform-web/frontend/web/index.php?device=1&op=edit

重定向或重写必须是非永久性的。这意味着读取它的浏览器不能缓存它。如果我从我的网络根目录 (http://test.lab.example.com/) 中删除

.htaccess
文件,则必须停止重定向或重写。并且任何访问
http://test.lab.example.com/mech-platform/
的浏览器都必须遇到 404 错误(在删除 .htaccess 文件夹之后),因为该文件夹实际上并不存在。

###尝试解决方案

我是 Apache 配置或 mod 重写的新手,所以到目前为止我所实现的只是复制粘贴在 SO 中找到的修改后的解决方案,调整它们并发现它们不起作用。

例如,我尝试过这个:

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)/mech-platform/(.*)$ $1/mech-platform-web/frontend/web/$2 [R,L]

完全失败(“在此服务器上找不到请求的 URL”)。

我也尝试过以下一种:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^test.\lab\.example\.com$
RewriteRule (.*) http://test.lab.example.com/mech-platform/$1 [R=301,L]
RewriteRule ^$ mech-platform-web/frontend/web [L]

此操作因“内部服务器错误”而失败。

完全出于意外,我尝试了上述操作,并删除了“测试”子域/部分。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^lab\.example\.com$
RewriteRule (.*) http://lab.example.com/mech-platform/$1 [R=301,L]
RewriteRule ^$ mech-platform-web/frontend/web [L]

对于预期的 URL

http://lab.example.com/mech-platform/
,它再次抛出“内部服务器错误”。当尝试访问整个子域时 -
http://lab.example.com/
- 我被重定向到
mech-platform-web/frontend/web
的正确子文件夹。

然而,这一定是某些错误/误解的产物。此外,它还会产生永久重定向(浏览器会缓存它并重用,即使 .htaccess 文件从服务器中删除)。它使它不可见。用户可以一直看到

mech-platform-web/frontend/web
文件夹,甚至访问上面的文件夹(例如
mech-platform-web/frontend
mech-platform-web
。这在安全性方面完全失败。

apache .htaccess redirect
1个回答
0
投票

以下规则应该适用于站点根目录 .htaccess:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^test\.lab\.example\.com$ [NC]
RewriteRule ^mech-platform/(.*) mech-platform-web/frontend/web/$1 [NC,L]

如果您想阻止访问者访问所有其他文件和文件夹,请在最后添加此规则:

RewriteRule !^(mech-platform-web/|$) [NC,F]

此规则将进行静默重写,一旦您删除此 .htaccess 或注释掉此规则,该规则将停止工作。

© www.soinside.com 2019 - 2024. All rights reserved.