基于Apache配置实现多域名访问PHP应用时保留来源域名信息并保持浏览器URL不变
基于Apache配置实现多域名访问PHP应用时保留来源域名信息并保持浏览器URL不变
我来帮你搞定这个问题,咱们先理清核心需求:既要让test1.com、test2.com访问同一个PHP应用时浏览器URL完全不变,又要在PHP里能准确拿到用户是从哪个域名进来的。之前的配置没生效,主要是没走对反向代理的路子,还有Session丢失的问题也和URL跳转直接相关,咱们一步步调整:
一、先调整本地域名解析(Hosts文件)
首先把三个域名都指向本地IP,这样Apache才能接收到这些域名的请求:
- Windows:打开
C:\Windows\System32\drivers\etc\hosts,添加以下内容:127.0.0.1 test1.com 127.0.0.1 test2.com 127.0.0.1 my.loc - Linux(Ubuntu):打开
/etc/hosts,添加同样的内容即可。
二、确保Apache启用必要模块
要实现反向代理和请求头传递,必须开启这几个核心模块:
- Windows(XAMPP):打开Apache的
httpd.conf配置文件,去掉下面几行前面的注释:LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule headers_module modules/mod_headers.so - Linux(Ubuntu):执行命令开启模块,然后重启Apache生效:
sudo a2enmod proxy proxy_http headers sudo systemctl restart apache2
三、配置Apache虚拟主机
1. 代理域名(test1.com、test2.com)的配置
这些虚拟主机负责接收用户的请求,悄悄代理到实际的应用地址(my.loc),同时把原始域名信息传递给后端:
HTTP(80端口)配置
<VirtualHost *:80> ServerName test1.com # 将请求代理到实际应用地址 ProxyPass / http://my.loc/ # 修正后端响应的URL,避免浏览器自动跳转 ProxyPassReverse / http://my.loc/ # 把原始请求的域名放到自定义请求头里,传给后端PHP RequestHeader set X-Original-Host %{HTTP_HOST}s </VirtualHost> <VirtualHost *:80> ServerName test2.com ProxyPass / http://my.loc/ ProxyPassReverse / http://my.loc/ RequestHeader set X-Original-Host %{HTTP_HOST}s </VirtualHost>
HTTPS(443端口)配置(如果需要HTTPS访问)
<VirtualHost *:443> ServerName test1.com SSLEngine On # 替换成你的SSL证书实际路径 SSLCertificateFile "path/to/test1.com.crt" SSLCertificateKeyFile "path/to/test1.com.key" ProxyPass / https://my.loc/ ProxyPassReverse / https://my.loc/ RequestHeader set X-Original-Host %{HTTP_HOST}s </VirtualHost> <VirtualHost *:443> ServerName test2.com SSLEngine On SSLCertificateFile "path/to/test2.com.crt" SSLCertificateKeyFile "path/to/test2.com.key" ProxyPass / https://my.loc/ ProxyPassReverse / https://my.loc/ RequestHeader set X-Original-Host %{HTTP_HOST}s </VirtualHost>
2. 实际应用域名(my.loc)的配置
这个虚拟主机负责运行你的PHP应用,确保它能正常接收代理过来的请求:
HTTP配置
<VirtualHost *:80> ServerName my.loc # 替换成你的PHP应用所在的实际路径 DocumentRoot "C:/xampp/htdocs/testapp" # Windows示例 # DocumentRoot "/var/www/testapp" # Linux示例 <Directory "C:/xampp/htdocs/testapp"> # 对应上面的路径 AllowOverride All Require all granted </Directory> </VirtualHost>
HTTPS配置
<VirtualHost *:443> ServerName my.loc SSLEngine On SSLCertificateFile "path/to/my.loc.crt" SSLCertificateKeyFile "path/to/my.loc.key" DocumentRoot "C:/xampp/htdocs/testapp" <Directory "C:/xampp/htdocs/testapp"> AllowOverride All Require all granted </Directory> </VirtualHost>
四、PHP中获取来源域名
现在,当用户访问test1.com或test2.com时,Apache会把原始域名放到X-Original-Host请求头里,PHP可以通过$_SERVER全局变量直接获取:
// 优先取自定义请求头里的原始域名, fallback到当前服务域名 $originalHost = $_SERVER['HTTP_X_ORIGINAL_HOST'] ?? $_SERVER['SERVER_NAME']; echo "用户来自域名:" . $originalHost;
这样不管是第一次访问还是后续请求,都能准确拿到用户进入的域名;而且因为浏览器始终显示test1.com/test2.com,Session Cookie会绑定在这些域名下,不会再出现之前的Session丢失问题。
五、验证配置
- 重启Apache(Windows下XAMPP控制面板点重启;Linux下
sudo systemctl restart apache2) - 打开浏览器访问
https://test1.com,地址栏会保持test1.com不会跳转 - 在PHP应用里输出
var_dump($_SERVER['HTTP_X_ORIGINAL_HOST']);,应该能看到test1.com,同理访问test2.com会得到test2.com
备注:内容来源于stack exchange,提问作者Kobus Myburgh
相关产品推荐
相关产品推荐

