我正在尝试将一个子目录代理到另一台服务器。我的httpd . conf。
RewriteEngine On
ProxyPreserveHost On
RewriteRule .*subdir/ https://anotherserver/subdir/ [P]
问题是Apache总是记录这些:
AH01144: No protocol handler was valid for the URL /subdir/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: http://localhost/
所以在网上搜索之后,我激活了这些模块:
LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule rewrite_module modules/mod_rewrite.so
(我知道我不需要所有的,但我只是激活他们,以确保我没有错过一个)
但是这个错误仍然出现,客户端得到一个HTTP 500。
我该如何解决这个问题?
这发生在我的Apache/2.4.18 (Ubuntu)安装中。在我的例子中,我看到的错误是:
... AH01144: No protocol handler was valid for the URL /~socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
与此相关的配置是:
ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/
URL /~套接字没有有效的协议处理程序。意思是Apache不能处理发送到"ws://127.0.0.1:8090/~socket.io/"的请求。
我已经加载了proxy_http,但还需要proxy_wstunnel。一旦启动,一切都好了。
这发生在我的Apache/2.4.18 (Ubuntu)安装中。在我的例子中,我看到的错误是:
... AH01144: No protocol handler was valid for the URL /~socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
与此相关的配置是:
ProxyPass /~socket.io/ ws://127.0.0.1:8090/~socket.io/
ProxyPassReverse /~socket.io/ ws://127.0.0.1:8090/~socket.io/
URL /~套接字没有有效的协议处理程序。意思是Apache不能处理发送到"ws://127.0.0.1:8090/~socket.io/"的请求。
我已经加载了proxy_http,但还需要proxy_wstunnel。一旦启动,一切都好了。
我在这里发布了一个答案,因为我因为不同的原因收到了相同的错误消息。
例如,如果您正在使用apache httpd将请求从协议a上的源代理到协议B上的目标,则可能发生此错误消息。
下面是我的例子:
URL /sockjs-node/info没有有效的协议处理程序
(计划“ws”)。
在上面的例子中,发生的事情很简单。
我已经启用了mod代理,根据路径/sockjs-node将websocket请求代理到nodejs。
问题是该节点没有使用路径/sockjs-node专门websocket请求。它还使用此路径托管REST入口点,这些入口点传递关于websocket的信息。
以这种方式,当应用程序尝试打开http://localhost:7001/sockjs-node/info时,apache httpd将尝试将其余调用从HTTP协议路由到Webscoket端点调用。Node不接受这一点。
这导致了上面的异常。
所以要注意,即使您启用了正确的模块,如果您试图进行错误的转发,apache httpd将会通知您尝试在目标服务器上使用的协议无效。