apache 将子目录映射为子域名需通过 proxypass 反向代理实现,而非仅靠 rewriterule;关键在于 proxypreservehost on 保持 host 头、301 重定向旧链接、cookie 设置 domain=.example.com 及静态资源路径适配。

Apache 用 URL 重写把子目录变成子域名,本质是反向代理 + 重写规则配合,不是单纯靠 RewriteRule 就能“伪装”成功——因为浏览器地址栏要变、资源路径要适配、Cookie 和 Session 也要对齐,否则会出现样式丢失、登录失效、AJAX 跨域等问题。
下面分三步讲清楚怎么做,重点在关键细节和常见坑:
用 ProxyPass 实现真实子域名映射
子目录(如 example.com/app/)要对外表现为 app.example.com,最稳妥的方式是让 Apache 把 app.example.com 的所有请求代理到后端的 /app/ 路径,而不是靠重定向或路径改写。
-
先确保启用模块:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
-
配置虚拟主机(单独为
app.example.com):
Apache 2.4.62下载PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
<virtualhost> ServerName app.example.com ProxyPreserveHost On ProxyPass / http://localhost:8080/app/ ProxyPassReverse / http://localhost:8080/app/ </virtualhost>ProxyPreserveHost On很关键:它让后端应用收到的Host头仍是app.example.com,避免因 Host 不匹配导致的跳转错误或静态资源路径异常。
RewriteRule 辅助处理旧链接与重定向
如果已有大量用户访问 example.com/app/,想自动跳转到新域名,加一条 301 重定向:
<virtualhost>
ServerName example.com
RewriteEngine On
RewriteRule ^/app/(.*)$ http://app.example.com/$1 [R=301,L]
</virtualhost>
- 注意:
^/app/(.*)$匹配以/app/开头的路径,$1保留后续路径,保证跳转后 URL 完整。 -
R=301是永久重定向,利于 SEO;测试阶段可用R=302。
Cookie 和静态资源路径适配不能漏
子域名和根域名属于不同站点(app.example.com ≠ example.com),默认 Cookie 不会共享,前端 JS/AJAX 请求也可能因同源策略失败。
- 后端设 Cookie 时需指定
Domain=.example.com(注意开头的点),这样app.example.com和example.com都能读取; - 前端资源引用(CSS/JS/img)建议用相对路径或协议相对路径(如
//example.com/static/xxx.js),避免硬编码/app/static/; - 如果应用本身生成绝对路径(比如 Spring MVC 的
<url></url>或 Vue Router 的base),需要配置为支持多入口,例如设base="/"并统一由 Nginx/Apache 处理路径映射。
不复杂但容易忽略。










