如何在Apache(WAMP)中通过公网用同一域名访问不同目录(支持FCGI多PHP版本)
同一域名公网访问不同FCGI站点(多PHP版本)的实现方案
问题概述
需要通过公网使用同一域名访问两个不同的PHP项目,每个项目对应不同版本的PHP(FCGI模式),本地局域网访问正常,但公网无法访问。期望实现:
- project1:
mydomain.ddns.net(80端口) - project2:
mydomain.ddns.net:8081(8081端口)
当前存在ServerName重复配置,且公网访问失败,需确认端口方案可行性及其他替代方案。
当前配置分析
Hosts文件配置
::1 localhost 127.0.0.1 localhost 192.168.2.5 localhost 192.168.2.5 mydomain.ddns.net 192.168.2.5 project1.local 192.168.2.5 project2.local
httpd.conf配置
Defines MYPORT8081 8081 Listen 0.0.0.0:80 Listen [::0]:80 Listen 0.0.0.0:${MYPORT8081} Listen [::0]:${MYPORT8081}
httpd-vhost.conf配置
<VirtualHost *:80> ServerName localhost DocumentRoot c:/wamp/www <Directory "c:/wamp/www/"> Options +Indexes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName mydomain.ddns.net DocumentRoot "c:/wamp/www/project1" <Directory "c:/wamp/www/project1/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <IfModule fcgid_module> Defines FCGIPHPVERSION "7.4.22" FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION} <Files ~ "\.php$"> Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI AddHandler fcgid-script .php FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php </Files> </IfModule> </VirtualHost> <VirtualHost *:${MYPORT8081}> ServerName mydomain.ddns.net DocumentRoot "c:/wamp/www/project2/public" <Directory "c:/wamp/www/project2/public/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> </VirtualHost>
端口方案的可行性与修正步骤
1. 端口方案本身合法
Apache允许同一域名绑定不同端口的VirtualHost,因为VirtualHost匹配逻辑是端口 + ServerName的组合,所以当前ServerName mydomain.ddns.net在不同端口的配置不存在冲突,是合法的。
2. 公网访问失败的核心解决步骤
公网访问失败通常由以下两点导致,需逐一排查:
- 配置路由器端口映射:进入路由器后台,将公网的80、8081端口映射到内网服务器的
192.168.2.5对应端口。 - 开放服务器防火墙端口:在Windows防火墙(或第三方防火墙)中添加入站规则,允许80、8081端口的TCP连接。
3. 完善project2的FCGI配置
当前project2的VirtualHost未配置对应PHP版本的FCGI规则,需补充(示例使用PHP 8.1.x,根据实际版本调整):
<VirtualHost *:${MYPORT8081}> ServerName mydomain.ddns.net DocumentRoot "c:/wamp/www/project2/public" <Directory "c:/wamp/www/project2/public/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <IfModule fcgid_module> Defines FCGIPHPVERSION "8.1.30" FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION} <Files ~ "\.php$"> Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI AddHandler fcgid-script .php FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php </Files> </IfModule> </VirtualHost>
其他替代方案(若端口方案受限)
方案1:子域名访问
如果DDNS服务商支持子域名解析,可配置两个子域名:
project1.mydomain.ddns.net指向192.168.2.5project2.mydomain.ddns.net指向192.168.2.5
修改VirtualHost配置,分别绑定子域名:
<VirtualHost *:80> ServerName project1.mydomain.ddns.net DocumentRoot "c:/wamp/www/project1" <!-- 对应project1的FCGI配置,同之前的80端口配置 --> </VirtualHost> <VirtualHost *:80> ServerName project2.mydomain.ddns.net DocumentRoot "c:/wamp/www/project2/public" <!-- 对应project2的FCGI配置,同之前的8081端口补充配置 --> </VirtualHost>
此方案无需额外端口映射,仅需开放80端口。
方案2:子目录访问
通过同一域名的子目录区分两个项目,例如:
mydomain.ddns.net/project1mydomain.ddns.net/project2
配置示例(在主VirtualHost中添加Alias和目录规则):
<VirtualHost *:80> ServerName mydomain.ddns.net DocumentRoot "c:/wamp/www" # project1 子目录配置 Alias /project1 "c:/wamp/www/project1" <Directory "c:/wamp/www/project1/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <Location /project1> <IfModule fcgid_module> Defines FCGIPHPVERSION "7.4.22" FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION} <Files ~ "\.php$"> Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI AddHandler fcgid-script .php FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php </Files> </IfModule> </Location> # project2 子目录配置 Alias /project2 "c:/wamp/www/project2/public" <Directory "c:/wamp/www/project2/public/"> Options +Indexes +Includes +FollowSymLinks +MultiViews AllowOverride All Require all granted </Directory> <Location /project2> <IfModule fcgid_module> Defines FCGIPHPVERSION "8.1.30" FcgidInitialEnv PHPRC ${PHPROOT}${FCGIPHPVERSION} <Files ~ "\.php$"> Options +Indexes +Includes +FollowSymLinks +MultiViews +ExecCGI AddHandler fcgid-script .php FcgidWrapper "${PHPROOT}${FCGIPHPVERSION}/php-cgi.exe" .php </Files> </IfModule> </Location> </VirtualHost>
内容的提问来源于stack exchange,提问作者Sylar
相关产品推荐
相关产品推荐

