Apache 反向代理可以获取但无法放置/发布(403 响应)

Apache 反向代理可以获取但无法放置/发布(403 响应)

我是 Apache 新手,当我的网站调用 ajax 到 api 服务器时遇到了问题。

例子:

https://example.com:11721(自签名证书)

https://api.example.com(自签名证书)

GET 请求: https://example.com:11721/api/message -> https://api.example.com/api/message

PUT 请求: https://example.com:11721/api/message/read -> https://api.example.com/api/message/read

我的配置可以调用 get 请求,但 put/post 请求响应(403 禁止)。

这是我的 Apache 配置:

<IfDefine SSL>
<VirtualHost *:11721>
    ServerName  https://example.com
    ServerAlias example.com
    RewriteEngine on
    include conf/security.conf
    include conf/method.conf
    include conf/extension.conf
    include app_conf.d/https.mydomain.conf

    SetEnv SERVER_URL https://example.com
    SetEnv HTTPS ON
    #add SSL
    SSLEngine on
    
    # ---- Bellow config allow get request but put/post request response 403, if don't config follow it server will response 500.----------
    SSLProxyEngine on
    SSLProxyVerify none
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off
    # ------ END ---------

    ProxyPass "/api" "https://ip-api-sever/api"
    ProxyPassReverse "/api" "https://ip-api-sever/api"

    SSLCertificateFile "/usr/local/apache/2.4.10/conf/server.crt"
    SSLCertificateKeyFile "/usr/local/apache/2.4.10/conf/server.key"
    
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

    CustomLog "|/usr/local/apache/2.4/bin/rotatelogs /var/apachelog/common/ssl/access.log.%Y%m%d%H%M%S 3600 +540" fanformat env=!images

    #mod_balancer
    include conf.d/proxy.https.mydomain.conf

</VirtualHost>
</IfDefine>

请帮助我,谢谢


感谢您的支持。

按照你的说明更改配置后,我认为你是对的。但我又遇到了另一个错误。

我的错误日志:

[2018 年 4 月 19 日星期四 16:21:46.115579] [ssl:debug] [pid 1183] ssl_engine_kernel.c(1378): [remote xx.xx.xx.xx:443] AH02275: 证书验证,深度 2,CRL 检查模式:无 [主题:CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\, Inc. - 仅供授权使用,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US / 发行人:OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US / 序列号:xxxxxxxxxx/ notbefore:2006 年 11 月 8 日 00:00:00 GMT / notafter:2021 年 11 月 7 日 23:59:59 GMT]

[2018 年 4 月 19 日星期四 16:21:46.115703] [ssl:info] [pid 1183] [remote xx.xx.xx.xx:443] AH02276:证书验证:错误 (20):无法获取本地颁发者证书 [主题:CN=VeriSign Class 3 Public Primary Certification Authority - G5,OU=(c) 2006 VeriSign\, Inc. - 仅供授权使用,OU=VeriSign Trust Network,O=VeriSign\, Inc.,C=US / 颁发者:OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US / 序列号:xxxxxxxxxxxxxxxxxx/ notbefore:2006 年 11 月 8 日 00:00:00 GMT / notafter:2021 年 11 月 7 日 23:59:59 GMT]

[2018 年 4 月 19 日星期四 16:21:46.115902] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH02003:SSL 代理连接失败

[2018 年 4 月 19 日星期四 16:21:46.115960] [ssl:info] [pid 1183] SSL 库错误:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

[2018 年 4 月 19 日星期四 16:21:46.115979] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH01998:与子进程 0 的连接已关闭,且关闭中止(服务器 mydomain:443)

[2018 年 4 月 19 日星期四 16:21:46.116014] [ssl:info] [pid 1183] [远程 xx.xx.xx.xx:443] AH01997:SSL 握手失败:发送 502

[2018 年 4 月 19 日星期四 16:21:46.116064] [proxy_http:error] [pid 1183] (103)软件导致连接中止:[客户端 10.128.14.1:48138] AH01102:从远程服务器 xx.xx.xx.xx:443 读取状态行时出错 [2018 年 4 月 19 日星期四 16:21:46.116115] [proxy_http:debug] [pid 1183] mod_proxy_http.c(1369):[客户端 10.128.14.1:48138] AH01105:尽管从后端服务器 xx.xx.xx.xx:443 读取失败,但未关闭与客户端的连接。

你知道该如何解决这个问题吗?

谢谢。

答案1

您提到您在代理服务器上使用自签名证书。在这种情况下,您必须包含 SSLProxyCACertificateFile 指令,以便让当前服务器信任代理服务器提供的自签名证书。请记住,还要包含 CA 证书的路径。

需要更改/添加的配置部分:

SSLProxyVerify require
SSLProxyVerifyDepth 1
SSLProxyCACertificateFile "/path/to/the/CACertifcateFile"
SSLProxyCheckPeerName on

因此你的整个配置文件应该是这样的:

<IfDefine SSL>
<VirtualHost *:11721>

    #----Local Configuration:#

    ServerName  https://example.com
    ServerAlias example.com
    RewriteEngine on
    include conf/security.conf
    include conf/method.conf
    include conf/extension.conf
    include app_conf.d/https.mydomain.conf

    SetEnv SERVER_URL https://example.com
    SetEnv HTTPS ON


    SSLEngine on
    SSLCertificateFile "/usr/local/apache/2.4.10/conf/server.crt"
    SSLCertificateKeyFile "/usr/local/apache/2.4.10/conf/server.key"

    #----Proxy Configuration:#

    SSLProxyEngine on

    ProxyRequest off
    ProxyPass "/api" "https://ip-api-sever/api"
    ProxyPassReverse "/api" "https://ip-api-sever/api"

    SSLProxyVerify require
    SSLProxyVerifyDepth 1
    SSLProxyCACertificateFile "/path/to/the/CACertifcateFile"
    SSLProxyCheckPeerName on

    #----Local Configuration:#        

    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

    CustomLog "|/usr/local/apache/2.4/bin/rotatelogs /var/apachelog/common/ssl/access.log.%Y%m%d%H%M%S 3600 +540" fanformat env=!images

    #mod_balancer
    include conf.d/proxy.https.mydomain.conf

</VirtualHost>
</IfDefine>

答案2

您缺少"ProxyPassReverse 指令。这就是 GET 请求有效而 POST/PUT 请求无效的原因。

改变这个:

 ProxyPass "/api" "https://ip-api-sever/api"
 ProxyPassReverse /api" "https://ip-api-sever/api"

对此:

 ProxyPass "/api" "https://ip-api-sever/api"
 ProxyPassReverse "/api" "https://ip-api-sever/api"

相关内容