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

如何在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.5
  • project2.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/project1
  • mydomain.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:15:56