如果这个问题已经被问过,我很抱歉,但我不知道如何以不同的方式提出它——我的搜索都没有找到可以回答这个问题的东西。
我目前正在使用 Windows 11 和 XAMPP,以及 Apache 2.4.x 和 PHP 8.1.x,但我正在寻找的解决方案最终将在使用相同 Apache 和 PHP 版本的 Linux(Ubuntu)服务器上运行。
我有两个网址,比如说,在我的 Windows Host 文件上设置,目前重定向到https://test1.com
本地PHP 应用程序。https://test2.com
http://localhost/testapp
我们的目标是在您从任一域进入 testapp 时设置会话或标志或其他内容,以便我在 PHP 应用程序中可以使用该信息。由于重定向发生在我们进入 PHP 之前,我怀疑执行此操作的地方是在 Apache 中,我需要设置然后检索$_SERVER
信息变量的值,或类似的东西。
问题:
我该如何实现这一点?可以实现吗?
编辑:
根据下面 Gerald 的评论,我得出的结论如下:
我$_SERVER['SERVER_NAME']
现在已经在任何重定向之前捕获了它,然后将其设置在会话变量中,但是当我进入test1.com
浏览器时,它显然按照我的指令进入localhost/testapp
,然后会话变量丢失。
我现在位于与我按照浏览器输入的地址不同的“站点”,因此这很有意义(至少对我来说)。
在我的 Apache 配置中,我现在有:
LoadModule remoteip_module modules/mod_remoteip.so
<IfModule remoteip_module>
RemoteIPHeader X-Forwarded-For
</IfModule>
根据@HBruijn给出的答案,我的虚拟主机中也有以下内容:
<VirtualHost *:80>
ServerName test1.com
UseCanonicalName Off
ProxyPass / https://my.loc/
</VirtualHost>
<VirtualHost my.loc:443>
DocumentRoot "path/to/code/"
ServerName my.loc:443
SSLEngine on
SSLCertificateFile "path\to\server.crt"
SSLCertificateKeyFile "path\to\server.key"
UseCanonicalName Off
</VirtualHost>
<VirtualHost my.loc:80>
DocumentRoot "path/to/code/"
ServerName my.loc
UseCanonicalName Off
</VirtualHost>
它似乎没有做任何事情,并且输出$_SERVER
全局变量表明它不存在。
次要问题:
有什么方法可以让浏览器中的 URL 保持不变?我可以在 Apache 配置中设置什么吗?
答案1
通过 URL 上的“重定向”,您可以指示网站访问者使用您的网络服务器提供的目标 URL 发出新请求。
当发出目标 URL 请求时,您无法可靠地区分直接针对目标 URL 发出的请求和通过重定向发出的请求。
如果原始 URL 很重要,不应丢失;那么不重定向。
您可以通过在 VirtualHost 定义中包含访问者在访问 Web 应用程序时允许使用的所有域名来避免重定向,方法是使用ServerAlias
。
<VirtualHost *:80>
ServerName server.example.com
ServerAlias server server2.example.com server2 localhost *.example.net
UseCanonicalName Off
DocumentRoot /path/to/your/content-and-php-code
# ...
</VirtualHost>
在上面的例子中,你可以使用$_SERVER['HTTP_HOST']
另一种方法是在您当前重定向的域上使用反向代理。然后,对于每个对 example.com 的请求,您的 Web 服务器都会在后台向 发出第二个请求localhost
,其中包括 X-FORWARDED-FOR 标头,您可以在后端应用程序中使用该标头。
就像是:
<VirtualHost localhost:80>
ServerName localhost
UseCanonicalName Off
DocumentRoot /path/to/your/content-and-php-code
# ...
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
UseCanonicalName Off
# https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html
# https://httpd.apache.org/docs/2.4/mod/mod_proxy.html
ProxyPass / http://localhost/
ProxyPassReverse / http://localhost/
# ...
</VirtualHost>