Apache VirtualHost с аутентификацией, веб-сокеты - PullRequest
0 голосов
/ 05 октября 2018

Я использую сервер Spotify на Raspberry Pi в магазине школьной робототехники.Он находится в школьной сети Wi-Fi и доступен через веб-страницу http://localhost:6680. Я хотел добавить базовую аутентификацию HTTP (имя пользователя / пароль), потому что люди были злонамеренными, поэтому я использую Apache VirtualHost в качестве прокси-сервера с базовой аутентификацией,

Кроме того, веб-серверу требуется, чтобы WebSockets функционировал через тот же порт.Я успешно настроил файл VirtualHost, и он работает нормально ... за исключением того, что он не работает на Safari или iOS.После просмотра в консоли все запросы WebSocket в Safari возвращают ошибку 401:

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

Если посмотреть на это подробнее, очевидно, это известная ошибка в Safari.Вот файл 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>

Есть ли какой-нибудь способ, которым мы можем просто удалить аутентификацию для просто веб-сокетов, но не для веб-страницы?Учитывая, как это структурировано, это должно быть так, но это не так.Спасибо!

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Убедитесь, что вы используете прокси через веб-сокеты, если это необходимо.Они могут выглядеть примерно так:

ProxyPass        /socket.io http://localhost:6680/socket.io
ProxyPassReverse /socket.io http://localhost:6680/socket.io
0 голосов
/ 13 октября 2018

Попробуйте сделать следующее, как описано здесь :

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

Обновление: пожалуйста, имейте в виду, что это правило широко, как вы видите.

0 голосов
/ 09 октября 2018

Я не знаю много о 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...