Предисловие
Во-первых: просто Port 80 -> Port 443 Rewrite НЕ БУДЕТ исправить это. Почти в каждом предыдущем вопросе, почтовой ветке, ветке форума и т. Д. Я обнаружил, что это был первый невежественный ответ, который несколько раз подвергался попугаям.
Во-вторых: Да, я знаю, что вы не можете обслуживать трафик HTTP и HTTPS на одном и том же порту. Это не то.
Сценарий:
Apache Server, на котором размещены несколько сайтов с помощью умножения портов. Порт 80 обслуживает публичный сайт. Порт 443 обслуживает безопасную версию этого сайта.
Порты 7443, 8443 и 9443 каждый обслуживают отдельные сайты, защищенные SSL.
Если пользователь неправильно набирает URL-адрес или получает недействительную ссылку, например, http: //hostname.tld: 7443 , ему предоставляется следующая нелепая страница:
Вместо сервера просто перенаправьте их на https: //hostname.tld: 7443 .
Мой вопрос заключается в том, как во имя жопы Зевса вы можете изменить поведение Apache или это сообщение об ошибке для автоматического перенаправления пользователя?
Apache, очевидно, обслуживает не-https запрос (для отображения этого сообщения об ошибке), даже если он настроен для HTTPS. Мне кажется удивительно глупым не просто выполнять перенаправление по умолчанию, но я могу понять, почему они пошли с тем же поведением, что и они, даже если я с этим не согласен. Итак, мой вопрос: вы можете изменить это? Они обрабатывают ошибку КУДА-ТО, и, учитывая, что Apache является конфигурацией изобилия, которая есть, понятно, что где-то есть какая-то директива, чтобы справиться с этим поведением, но я до сих пор не смог найти ее за несколько часов работы.
Обновить:
Я пытался различные вещи, в том числе:
используя
ErrorDocument 400
директивы , чтобы получить к CGI и PHP скрипт , который просто отправитьStatus 301
иLocation
заголовки. Это приводит к пустой странице. ИспользованиеErrorDocument 400 https://hostname.tld:7443
просто приводит к тому, что эта ссылка отображается на странице.mod_rewrite
Можно использовать почти каждую комбинацию I или Google, включая общие заявления, которые полностью управляют сайтом; это никогда не работает. Буквально они ничего не делают. Я предполагаю, что Apache пытается выполнить описанную выше ошибку еще до того, как попытается обработать директивы перезаписи.
Я не могу использовать перенаправления на основе портов из-за использования пользовательских портов. Я не могу использовать перенаправления на основе сценариев, потому что они никогда не обслуживаются из-за несоответствия http / https. Я почти готов связать это с ошибкой или непреднамеренным поведением, но у кого-то была заранее продуманная идея поместить туда свое собственное сообщение об ошибке, они не удосужились подумать, что, возможно, вы захотите просто перенести на URL они уже предоставляют ?
источник
Ответы:
Я думаю, что это, вероятно, ошибка в том, как Apache 2.2 и ниже обрабатывает это конкретное обстоятельство.
Похоже, что при
400 Bad Request
ошибке чтения SSL Apache 2.2 не возвращает код ответа HTTP или заголовки, а только тело ответа HTTP. Я тестирую по telnetting на порт 443 и отправляю:Сервер сразу возвращает (для меня):
Обратите внимание на отсутствие кода ответа HTTP или каких-либо заголовков HTTP.
Когда я делаю это на сервере Apache 2.4, я получаю:
Если я настрою строку ErrorDocument, как вы сделали:
Затем я получаю HTML для перенаправления 302, но опять же, ни один из заголовков. Без кода ответа перенаправления 302 и
Location:
заголовка браузер не будет перенаправлять.Попробуйте обновить до Apache 2.4 и посмотреть, работает ли он. Я протестировал и подтвердил, по крайней мере, Apache 2.4.3, но я не пытался найти точно, когда это поведение было обновлено. Я подозреваю, что при большом объеме работы, которую они выполняли, готовя 2.4, они исправили нежелательное поведение как побочный эффект.
Соответствующие ошибки Apache httpd:
ОБНОВИТЬ
Вы можете заставить глючный Apache дать вам желаемое поведение (перенаправление), заставив скрипт распечатать свои заголовки (которые не будут отправлены клиенту), а затем вручную снова распечатать нужные заголовки. Вот основной Perl-скрипт, который работает под Apache 2.2.22:
Вы должны знать, что есть и другие причины, по которым может быть сгенерировано 400, помимо простого разговора с портом SSL без SSL. Самый простой способ определить это - найти
HTTPS
переменную среды. Если он установлен, то SSL был согласован правильно, и что-то еще вызывает 400 (не делайте трюк с двойным заголовком, если это так). ЕслиHTTPS
не установлено, верните перенаправление, как указано выше.источник
<javascript
тег и мне повезло с таким перенаправлением взлома, но пока нет игральная кость. Ничего из этого, похоже, не обрабатывается так, как это следует за довольно жесткой, по-другому, Apache ...Вы можете исправить это с помощью mod-rewrite. Установите правило, чтобы соответствовать чему-либо. Смотрите этот ответ на Stackoverflow
источник
sites-available
каталог. Даже если вы просто перенаправите его на ерунду или перенаправите на другой сайт, на другой порт и т. Д., Он просто продолжит загружать эти 400 неверных запросов.