Я не могу заставить mod_rewrite работать со следующими правилами.
RewriteCond "%{SERVER_NAME}" "home.myhome.net"
RewriteCond "%{SERVER_PORT}" "^4388$"
RewriteRule (.*) https://home.myhome.net:4389%{REQUEST_URI} [QSA,R=301,L]
Это Правило установлено в моем разделе виртуального хоста http. Проблема в том, что перенаправление работает только в первый раз. Во второй раз, когда я ввожу другой URL-адрес на http-порт 4388, я перенаправляюсь на https: //home.myhome.net: 4388/ ...
например:
Любая идея, как это исправить?
Сведения о моей ОС:
root@host:~# dpkg -l|grep apache
ii apache2 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server
ii apache2-bin 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server (modules and other binary files)
ii apache2-data 2.4.18-2ubuntu3.5 all Apache HTTP Server (common files)
ii apache2-utils 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server (utility programs for web servers)
ii python-certbot-apache 0.17.0-1+ubuntu16.04.1+certbot+1 all Apache plugin for Certbot
root@host:~# lsb_release -d
Description: Ubuntu 16.04.3 LTS
Это моя конфигурация виртуального хоста, это что-то другое, потому что я провел еще несколько тестов, но с таким же поведением. Я также отказался от тестирования всех других правил перезаписи с тем же результатом (и, как я сказал в комментариях, для каждого теста я очищаю кеш браузера).
<VirtualHost *:80>
ServerAdmin webmaster@myhome.net
DocumentRoot /var/www/html
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond "%{SERVER_NAME}" "home.myhome.net"
RewriteCond "%{SERVER_PORT}" "^4388$"
RewriteRule ^ https://%{SERVER_NAME}:4389%{REQUEST_URI} [noescape,qsappend,redirect=301,last]
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
О, и я забыл сказать, что этот сервер находится за шлюзом NAT, который перенаправляет порт с внешнего порта 4388 на внутренний порт 80 хоста, а также с внешнего порта 4389 на внутренний порт 443. Вот почему мне нужно проверить порт. и имя хоста, чтобы соответствовать только внешнему трафику.
РЕДАКТИРОВАТЬ: Хорошо, я кое-что нашел, но у меня тоже нет решения: я сравнил первый и следующий запрос / ответ браузера с инструментами разработчика браузера-> вкладка сети:
По первому запросу дайте мне "301 перемещен навсегда", но следующий запрос дает мне"307 Внутреннее перенаправление".
Так что это похоже на проблему с сервером. Вопрос только в том, ошибка ли это в mod_rewrite или это моя вина, потому что это правило не подходит.
РЕДАКТИРОВАТЬ: Я протестировал сейчас также с текущей версией apache 2.4.27-5.1 + ubuntu16.04.1 + deb.sury.org + 1 из Apache PPA Ондржея Сури
С уважением, Томас
Хорошо, после долгих поисков я наконец нашел причину. Я установил HTTP Strict-Transport-Security (HSTS) на своем веб-сайте https, поэтому браузер не запускается снова, чтобы открыть веб-сайт http по этому URL-адресу и принудительно использовать протокол https.
Все приведенные примеры работают.