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
。这在安全性方面完全失败。
以下规则应该适用于站点根目录 .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 或注释掉此规则,该规则将停止工作。