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

Apache中使用Location将/api/路径路由至3002端口失败问题

Apache代理/api/请求到3002端口失败的排查与修复

问题根源

你的配置里<Location "/api\/(.*)/">的写法存在两个关键问题:

  1. 该正则要求请求URL必须以/api/开头且结尾带斜杠,但实际请求/api/customers没有末尾斜杠,完全匹配不上,直接触发了根路径/的3008端口代理。
  2. <Location>指令默认是前缀匹配,带引号的正则表达式不会被解析,需要用<LocationMatch>来启用正则匹配逻辑。

修复方案

方案一:前缀匹配(推荐,简单可靠)

直接用前缀匹配/api/,确保所有以/api/开头的请求都被代理到3002端口,同时保留完整路径传递给后端服务:

<VirtualHost *:443>
    ServerAdmin (redacted)
    ServerName (redacted)
    ServerAlias (redacted)

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/(redacted)/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/(redacted)/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/(redacted)/chain.pem

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # 代理所有/api/开头的请求到3002,保留完整路径
    <Location "/api/">
        ProxyPass http://localhost:3002/api/
        ProxyPassReverse http://localhost:3002/api/
    </Location>

    # 其他请求代理到3008
    <Location "/">
        ProxyPass http://localhost:3008/
        ProxyPassReverse http://localhost:3008/
    </Location>
</VirtualHost>

方案二:正则匹配(适配更灵活的URL格式)

如果需要匹配所有以/api开头的请求(包括/api、/api/customers、/api/orders/123等格式),使用<LocationMatch>指令实现正则匹配:

<VirtualHost *:443>
    ServerAdmin (redacted)
    ServerName (redacted)
    ServerAlias (redacted)

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/(redacted)/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/(redacted)/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/(redacted)/chain.pem

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # 正则匹配所有/api开头的请求,保留路径传递给后端
    <LocationMatch "^/api(/.*)?$">
        ProxyPass http://localhost:3002/api$1
        ProxyPassReverse http://localhost:3002/api$1
    </LocationMatch>

    <Location "/">
        ProxyPass http://localhost:3008/
        ProxyPassReverse http://localhost:3008/
    </Location>
</VirtualHost>

后续验证步骤

  1. 重启Apache服务使配置生效:
    sudo systemctl restart apache2
    
  2. 测试请求https://example.com/api/customers,检查是否返回3002端口服务的响应
  3. 若仍有问题,查看Apache错误日志排查细节:
    tail -f /var/log/apache2/error.log
    

内容的提问来源于stack exchange,提问作者Willem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:35:48