具有身份验证的Apache VirtualHost,WebSocket

时间:2018-10-04 21:43:14

标签: apache websocket apache2 virtualhost

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

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

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

进一步研究之后,显然使用Safari it's a known bug。这是VirtualHost文件:

<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>

有什么方法可以仅删除对 的身份验证,而不是对Web站点的身份验证?考虑到它的结构,应该是这样,但事实并非如此。谢谢!

3 个答案:

答案 0 :(得分:0)

我对WebSockets不太了解,但是我确实知道,如果要分隔流量,应该始终声明要监听的VirtualHost端口。

尝试通过在同一配置中添加两个不同的VirtualHost来做到这一点:

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

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

从现在开始,我无济于事:

<VirtualHost *:6680>
 somethingsomethingsomething
</VirtualHost>

更新

我想您学校里的流量不同于:80。 我可以建议一种更激进的方法,该方法禁止Safari(台式机和移动设备)的所有流量。 您可以通过将重定向添加到礼貌页面(例如“不支持您的浏览器”)来修改配置。

 <Location *>
 SetEnvIfNoCase User-Agent .*Safari* bad_browser
 Deny from env=bad_browser
 </Location>

答案 1 :(得分:0)

如果需要,请确保您正在代理WebSocket。他们可能看起来像这样:

function saveAsJSON() {
  var blob,file,fileSets,obj;

  obj = {//Object literal for testing purposes
    key:"value"
  }

/**
 * Creates a file in the users Google Drive
 */

  fileSets = {
    title: 'AAA_Test.json',
    mimeType: 'application/json'
  };

  blob = Utilities.newBlob(JSON.stringify(obj), "application/vnd.google-apps.script+json");
  file = Drive.Files.insert(fileSets, blob);
  Logger.log('ID: %s, File size (bytes): %s, type: %s', file.id, file.fileSize, file.mimeType);

}

答案 2 :(得分:0)

尝试下一步,如here所述:

#In your case it will be like this:
<LocationMatch /(iris|mopidy)/ws>
  Allow from all
</LocationMatch>

更新:请注意,您会看到此规则的广泛范围。