You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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丢失问题。

五、验证配置

  1. 重启Apache(Windows下XAMPP控制面板点重启;Linux下sudo systemctl restart apache2)
  2. 打开浏览器访问https://test1.com,地址栏会保持test1.com不会跳转
  3. 在PHP应用里输出var_dump($_SERVER['HTTP_X_ORIGINAL_HOST']);,应该能看到test1.com,同理访问test2.com会得到test2.com

备注:内容来源于stack exchange,提问作者Kobus Myburgh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:00:30