基于URL动态配置RewriteBase 实现同域名访问两个PHP应用
同一域名下无路径暴露映射两个PHP应用需求
背景与需求
- 服务器环境:Linux,
public_html根目录下有app和landing(CMS)两个应用文件夹 - 映射规则:
- 访问
dev.domin.sk(根路径)时,加载landing应用,URL保持dev.domin.sk - 访问
dev.domin.sk/*(任意子路径)时,加载app应用,URL保持dev.domin.sk/xxx,不显示/app前缀
- 访问
- 此前配置可实现功能,但URL会强制跳转到
/landing/或/app/xxx,不符合需求
此前的功能可用但URL暴露的配置
<IfModule mod_rewrite.c> RewriteEngine On # Set the base depending on the condition RewriteCond %{HTTP_HOST} ^dev\.domin\.sk$ [NC] RewriteRule ^$ /landing/ [L] RewriteCond %{HTTP_HOST} ^dev\.domin\.sk$ [NC] RewriteRule !^landing/ /app%{REQUEST_URI} [L] # Handle trailing slash for the dating app RewriteCond %{REQUEST_URI} ^/app/([a-zA-Z0-9_-]+)/?$ RewriteRule ^ /app/%1 [R=301,L] </IfModule>
尝试过的无效配置
<IfModule mod_rewrite.c> RewriteEngine On # Set the base depending on the condition RewriteCond %{HTTP_HOST} ^dev\.domin\.sk$ [NC] RewriteRule ^$ - [E=BASE:/landing] RewriteCond %{HTTP_HOST} ^dev\.domin\.sk$ [NC] RewriteRule ^$/* - [E=BASE:/app] RewriteBase %{ENV:BASE}/$1 [L] </IfModule>
正确的.htaccess配置方案
<IfModule mod_rewrite.c> RewriteEngine On # 仅对目标域名生效,避免影响其他站点 RewriteCond %{HTTP_HOST} ^dev\.domin\.sk$ [NC] # 根路径请求:内部转发到landing的入口文件,URL保持不变 RewriteRule ^$ landing/index.php [L] # 非根路径请求:优先放行真实存在的文件/目录(比如图片、CSS) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 内部转发到app的入口文件,完整路径会传给app处理(适合带路由的PHP应用) RewriteRule ^(.*)$ app/index.php [L] # 若app是多页面结构,需要直接映射到对应文件,替换上面的RewriteRule为: # RewriteRule ^(.*)$ app/$1 [L] </IfModule>
关键说明
- 采用内部转发逻辑,不会修改浏览器地址栏的URL,彻底避免暴露文件夹路径
!-f和!-d条件确保服务器上真实存在的静态资源(如图片、JS、CSS)可以直接访问,不会被转发到应用入口- 如果你的
landing应用也需要处理子路径(比如CMS的后台路由),可以在landing文件夹内单独添加对应的.htaccess配置,根目录的规则只会处理根路径请求
内容的提问来源于stack exchange,提问作者Khalil DaNish
相关产品推荐
相关产品推荐

