Я использую сервер Spotify на своем Raspberry Pi в школьном магазине робототехники. Он находится в школьной сети Wi-Fi, и доступ к нему осуществляется через веб-страницу http: // локальный: 6680. Я хотел добавить базовую HTTP-аутентификацию (имя пользователя / пароль), потому что люди были злонамеренными, поэтому я использую Apache VirtualHost в качестве прокси с базовой аутентификацией.
Кроме того, веб-сервер требует, чтобы веб-сокеты работали через тот же порт. Я успешно настроил файл 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>
Есть ли способ просто удалить аутентификацию для просто веб-сокетов, но не для веб-страницы? Учитывая, как это структурировано, это должно быть так, но это не так. Спасибо!

Я мало что знаю о 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>
отредактировал свой пост с небольшой интеграцией, надеюсь, это поможет
Это не ответ на мой вопрос
При необходимости убедитесь, что вы проксируете свои веб-сокеты. Они могут выглядеть примерно так:
ProxyPass /socket.io http://localhost:6680/socket.io
ProxyPassReverse /socket.io http://localhost:6680/socket.io
Я делаю это в строках 11-15.
права жаль не заметил. Удачи в том, что может случиться? Странно, как ты говоришь, только он не работает в браузере IOS. Я имел дело с сокетами, но не имел этой проблемы. У меня возникла проблема с заголовками и прокси-серверами из разных источников.
Спасибо за попытку помочь. Это проблема с WebSockets, требующими аутентификации. Все браузеры, кроме Safari, отправляют заголовки аутентификации, когда они делают запрос ws, поэтому я просто хочу отключить требование аутентификации для всех запросов ws. Я так и не понял.
Не знаю, как настроено ваше приложение. Вы должны просто иметь возможность запрашивать данные для входа в систему для доступа к защищаемому приложению. Я не понимаю, зачем нужно аутентифицировать веб-сокет. Если пароль пользователя правильный, разрешите им отобразить веб-страницу, иначе выполните повторную аутентификацию.
Попробуйте сделать следующее, как описано здесь:
#In your case it will be like this:
<LocationMatch /(iris|mopidy)/ws>
Allow from all
</LocationMatch>
Обновление: помните, что это правило настолько широко, насколько вы видите.
К сожалению, это не работает. Никаких дополнительных ошибок или чего-то еще, я просто добавил это в конец моего файла VirtualHost, и та же проблема сохраняется.
Я не хочу, чтобы он размещался на порту 6680, я хочу, чтобы он проксировался с 6680 на 80, с HTTP-аутентификацией, но без аутентификации в ws. Ваш пример прокси-сервера как на порт 80, так и на порт 6680, что я не хотел бы делать.