Назад | Перейти на главную страницу

Apache перенаправляет с HTTPS на HTTP при добавлении завершающей косой черты в каталог

Я использую Apache с помощью Docker на AWS. Apache прослушивает порт 80 и обслуживает HTTP.

Apache находится за балансировщиком нагрузки AWS ELB, который прослушивает только порт 443, обслуживающий HTTPS.

Когда я прошу https://example.com/foo/ (с косой чертой в конце) он работает нормально, мой контент обслуживается.

Когда я прошу https://example.com/foo (без косой черты) перенаправляет на http://example.com/foo/ - то есть добавляет косую черту в конце (правильно), но перенаправляет с HTTPS на HTTP (неверно).

Что я могу с этим поделать?

Мой Dockerfile

FROM httpd:2.4
COPY . /usr/local/apache2/htdocs/

Когда я делаю запрос через curl:

$ curl -v https://example.com/foo
*   Trying 1.2.3.4...
* TCP_NODELAY set
* Connected to example.com (1.2.3.4) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: example.com
* Server certificate: Amazon
* Server certificate: Amazon Root CA 1
* Server certificate: Starfield Services Root Certificate Authority - G2
> GET /foo HTTP/1.1
> Host: example.com
> User-Agent: curl/7.54.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Date: Tue, 28 Nov 2017 09:17:26 GMT
< Content-Type: text/html; charset=iso-8859-1
< Content-Length: 247
< Connection: keep-alive
< Server: Apache/2.4.29 (Unix)
< Location: http://example.com/foo/
< 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://example.com/foo/">here</a>.</p>
</body></html>
* Connection #0 to host example.com left intact

Заранее спасибо.

< Server: Apache/2.4.29 (Unix)
< Location: http://example.com/foo/

Это говорит ваш серверный Apache. Он не понимает, что ваш клиент использует HTTPS, и выполняет перенаправление, поскольку он работал автономно. Без предоставления какой-либо конфигурации трудно сказать, как выполняется перенаправление, но вам нужно изменить его, чтобы перенаправить на https://вместо этого.

Это (не в но а) от центра знаний AWS может помочь вам сделать шаг вперед. Хотя исходная проблема немного отличается, предоставленное решение, вероятно, применимо и к этому случаю.

Как перенаправить HTTP-трафик на моем сервере на HTTPS на моем балансировщике нагрузки?

разрешение

Используя X-Forwarded-Proto В заголовке HTTP-запроса измените правило перезаписи веб-сервера, чтобы оно применялось только в том случае, если клиентский протокол - HTTP. Игнорируйте правило перезаписи для всех других протоколов, используемых клиентом.

Таким образом, если клиенты используют HTTP для доступа к вашему веб-сайту, они перенаправляются на URL-адрес HTTPS, а если клиенты используют HTTPS, они обслуживаются непосредственно веб-сервером.

Apache

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
...
</VirtualHost>

В httpd.conf измените ServerName с localhost на

ServerName https://localhost

Добавление https: // в начале этого параметра решило мне ту же проблему.

У меня та же проблема. Помещая это в .htaccess файл решает проблему для меня, используя (Apache 2.4.29):

# We noticed a issue where https://www.example.com/foo was being redirected to http://www.example.com/foo/ (notice not using SSL)
# Q: Why does a redirect occur?
# A: In Apache, mod_dir provides "trailing slash" redirects and defaults to "DirectorySlash On".
# Q: Why does it redirect to http?
# A: The AWS ALB decrypts the request and Apache gets HTTP so it matches the protocol.
# How we fix it: We redirect to HTTPS before Apache mod_dir DirectorySlash redirects to HTTP, using "RewriteOptions AllowNoSlash".
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /foo/
RewriteOptions AllowNoSlash
RewriteRule ^/(.*[^/])$ https://%{HTTP_HOST}/foo/ [R=301,L,QSA]
</IfModule>

Я бы предпочел использовать:

RewriteRule ^/(.*[^/])$ https://%{HTTP_HOST}/$1/ [R=301,L,QSA]

но это не сработало в моих тестах, не знаю почему. Я хотел бы найти лучшее решение.

Я бы посоветовал просмотреть ваши правила конфигурации в ваших файлах .conf для этого домена. Должен быть в /etc/httpd/conf/httpd.conf если вы не настроили apache для работы с поддоменами, и в этом случае он может находиться в папке с именем sites-enabled.

Мне кажется, что это, скорее всего, правило перезаписи, так что ищите его. Если вам нужна дополнительная помощь или подробности, разместите здесь свои файлы .conf, чтобы мы могли просмотреть их и проверить, если вы не уверены.