首页 > 解决方案 > 具有身份验证、websockets 的 Apache VirtualHost

问题描述

我在学校机器人商店的 Raspberry Pi 上运行 Spotify 服务器。它位于学校 wifi 网络上,可通过网页http://localhost:6680访问。我想添加基本的 HTTP 身份验证(用户名/密码),因为人们是恶意的,所以我使用 Apache VirtualHost 作为具有基本身份验证的代理。

此外,Web 服务器需要 WebSockets 通过相同的端口运行。我成功地设置了一个 VirtualHost 文件,它工作正常......除了它不能在 Safari 或 iOS 上工作。查看控制台后,Safari 中的所有 WebSocket 请求都返回 401 错误:

WebSocket connection to 'ws://XX.XXX.XX.XXX/iris/ws/' failed: Unexpected response code: 401

在对此进行了更多研究之后,显然这是 Safari 的一个已知错误。这是虚拟主机文件:

<VirtualHost *:80>
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  <Proxy *>
    Allow from all
  </Proxy>

  ProxyRequests On

  ProxyPass /mopidy/ws/ ws://localhost:6680/mopidy/ws/
  ProxyPassReverse /mopidy/ws/ ws://localhost:6680/mopidy/ws/

  ProxyPass /iris/ws/ ws://localhost:6680/iris/ws/
  ProxyPassReverse /iris/ws/ ws://localhost:6680/iris/ws/

  <Location />
    ProxyPass http://localhost:6680/
    ProxyPassReverse http://localhost:6680/

    AuthType Basic
    AuthName "Restricted Content"
    AuthUserFile /etc/apache2/.htpasswd
    Require valid-user
  </Location>
</VirtualHost>

有什么方法可以简单地删除websockets 而不是网页的身份验证?考虑到它的结构,应该是这样,但事实并非如此。谢谢!

标签: apachewebsocketapache2virtualhost

解决方案


如果需要,请确保您通过 websocket 进行代理。它们可能看起来像这样:

ProxyPass        /socket.io http://localhost:6680/socket.io
ProxyPassReverse /socket.io http://localhost:6680/socket.io

推荐阅读