我想在一台共享 apache 服务器上托管三个不同的应用程序,我们将它们称为 web、admin 和 api。该域名名为 www.test.com .
为了更好地维护,我希望这三个应用程序位于服务器上的不同文件夹中。我梦想的文件夹结构是:
/ ......................... root of the server
/www_test_folder/web ...... web app; www.test.com points to it
/www_test_folder/api ...... api app; www.test.com/api points to it
/www_test_folder/admin .... admin app; www.test.com/admin points to it
我尝试了一些 .htaccess 配置,但没有成功;所以我的一般问题...
这可能吗?如果是,.htaccess 会是什么样子?
我假设
/www_test_folder
是您的 DocumentRoot
- 主机名 www.test.com
已经指向的目录。
您不需要对 URL/路由
/admin
和 /api
执行任何特定操作(除了可能创建 例外),因为它们直接指向同名的子目录。但由于这些映射到物理子目录,这些应用程序的根“规范”URL 必须包含尾部斜杠。 IE。 /admin/
,而不是/admin
(否则 mod_dir 将发出 301 重定向以附加尾部斜杠)。
这只会让您对“Web 应用程序”实现内部重写,以在内部重写从根目录到
/web
子目录的请求。这可以在根 .htaccess
文件中实现(尽管具体如何实现取决于应用程序本身以及它们在相关应用程序子目录中是否有自己的 .htaccess
文件)。
例如:
# /.htaccess (root)
RewriteEngine On
# Rewrite requests that do not map to "/admin/..." or "/api/..." to the "/web" subdir
# Also exclude any requests that map directly to physical files or directories
RewriteCond %{REQUEST_FILENAME) !-f
RewriteCond %{REQUEST_FILENAME) !-d
RewriteRule !^(web|admin|api)($|/) web%{REQUEST_URI} [L]
文件系统检查(前两个条件)可能是必要的,也可能不是必要的,具体取决于子应用程序的配置方式。事实上,如果每个应用程序都有自己的
.htaccess
文件(在相关子目录中),该文件使用 mod_rewrite (例如前端控制器模式或规范重定向),那么上述规则可能会简化为简单的一行。例如:
RewriteRule ^ web%{REQUEST_URI} [L]
子目录中存在
.htaccess
文件(包含 mod_rewrite 指令)可防止错误重写,否则可能导致重写循环。这是因为 mod_rewrite 默认情况下不被继承。
然后,您需要阻止直接/用户访问
/web
子目录。尽管该子目录应该对用户完全隐藏,但如果它确实无意中暴露,则可能会导致重复内容问题。这意味着任何资产(图像、CSS、JS 等)都不应公开引用 /web
子目录。
这可以在同一个根
.htaccess
文件中实现(如果 Web 应用程序本身没有自己的 .htaccess
文件),但是,最好在 Web 应用程序自己的 .htaccess
文件(位于 )中执行此操作/web/.htaccess
。
例如:
# /web/.htaccess
# Prevent direct access to this subdirectory
# Redirect any requests for "/web/anything" back to the root, ie. "/anything"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=301,L]
RewriteRule
模式与相对URL路径匹配,即/web/
前缀之后的部分。针对 REDIRECT_STATUS
环境变量的检查可确保仅捕获来自客户端的直接请求,而不是通过根 .htaccess
文件中的重写来内部重写请求。