Вопрос или проблема
У меня есть веб-сервер за балансировщиком нагрузки Cloudflare, и перенаправление, которое я настроил в Apache, не работает. У меня на сервере работают два порта https: 443 и 8443. Большая часть трафика идет на порт 443, но у меня есть одна папка в URL, к которой я хочу получить доступ именно через порт 8443. У меня есть правила vhost в Apache, которые (сокращенные) выглядят так:
<VirtualHost *:443>
ServerName my.url.is.here
<LocationMatch "^(?=/subfolder-to-check)/[^/]*">
RewriteEngine On
RewriteRule ^/?(.*) https://my.url.is.here:8443/$1 [R=301,L]
# RewriteRule ^/?(.*) https://%{SERVER_NAME}:8443/$1 [R=301,L]
</LocationMatch>
</VirtualHost>
<VirtualHost *:8443>
ServerName my.url.is.here
<LocationMatch "^(?!/subfolder-to-check)/[^/]*">
RewriteEngine On
RewriteRule ^/?(.*) https://my.url.is.here:443/$1 [R=301,L]
# RewriteRule ^/?(.*) https://%{SERVER_NAME}:443/$1 [R=301,L]
</LocationMatch>
</VirtualHost>
Закомментированная строка была добавлена, потому что изначально Cloudflare не правильно подбирал переменную SERVER_NAME
, поэтому я просто задал URL вручную. Это работает в том смысле, что он корректно подбирает часть URL после / для применения соответствующего правила LocationMatch, но, похоже, игнорирует часть $1
в правиле переписывания для URL, на который он перенаправляет, только для правила 443-to-8443.
Если я перехожу по ссылке https://my.url.is.here/subfolder-to-check, он перенаправляет меня на https://my.url.is.here вместо https://my.url.is.here:8443/subfolder-to-check, хотя я могу получить доступ к этой папке по этому URL, если сначала укажу правильный порт (т.е. прямой переход по ссылке https://my.url.is.here:8443/subfolder-to-check работает).
В сумме:
- Порт 8443 на 443 с папкой для проверки работает как ожидалось (без совпадения)
- Порт 8443 на 443 с любой другой папкой работает как ожидалось (удаляя :8443 из URL)
- Порт 443 на 8443 с папкой для проверки не работает
- Порт 443 на 8443 с любой другой папкой работает как ожидалось (без совпадения)
Соответствие URL для редактирования, похоже, работает корректно, но место, куда вас перенаправляют, нет. Где я ошибаюсь?
Ответ или решение
Обзор проблемы
Ваша конфигурация Apache не обрабатывает перенаправление для определенной подкаталога, что приводит к неверному перенаправлению при попытке доступа к https://my.url.is.here/subfolder-to-check
. Вместо того чтобы перенаправлять на https://my.url.is.here:8443/subfolder-to-check
, сервер отправляет пользователей просто на https://my.url.is.here
. Давайте разберемся, как правильно настроить правила перенаправления и исправить ситуацию.
Анализ конфигурации
Виртуальный хост для порта 443
<VirtualHost *:443>
ServerName my.url.is.here
<LocationMatch "^(?=/subfolder-to-check)/[^/]*">
RewriteEngine On
RewriteRule ^/?(.*) https://my.url.is.here:8443/$1 [R=301,L]
</LocationMatch>
</VirtualHost>
Виртуальный хост для порта 8443
<VirtualHost *:8443>
ServerName my.url.is.here
<LocationMatch "^(?!/subfolder-to-check)/[^/]*">
RewriteEngine On
RewriteRule ^/?(.*) https://my.url.is.here:443/$1 [R=301,L]
</LocationMatch>
</VirtualHost>
Описание проблемы
-
Проблема с регулярным выражением в
LocationMatch
: В вашем первомLocationMatch
для порта 443, регулярное выражение^(?=/subfolder-to-check)/[^/]*
имеет ошибку. Оно направлено на поиск соответствий, но может не проверять корректно весь путь URL, и поэтому$1
оказывается пустым. -
Необходимо уточнение правил: Следует убедиться, что все части пути к
subfolder-to-check
корректно обрабатываются и передаются в новое перенаправление.
Решение
Обновленная конфигурация для порта 443:
Измените ваш LocationMatch
для порта 443 так, чтобы он корректно захватывал весь путь после /subfolder-to-check
. Сделайте следующую правку:
<VirtualHost *:443>
ServerName my.url.is.here
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/subfolder-to-check
RewriteRule ^/?(subfolder-to-check/.*) https://my.url.is.here:8443/$1 [R=301,L]
</VirtualHost>
Обновленная конфигурация для порта 8443:
Ваши правила для порта 8443 можно оставить без изменений, так как они уже правильно обрабатывают перенаправления.
Итог
Теперь перенаправление при обращении к https://my.url.is.here/subfolder-to-check
будет работать должным образом, и запрос будет перенаправлен на https://my.url.is.here:8443/subfolder-to-check
. Убедитесь также, что у вас правильно настроен mod_rewrite
.
Дополнительно проверьте кэширование Cloudflare, так как оно может сохранять старые правила перенаправления. После внесения изменений рекомендуется проверить работу правок в режиме инкогнито или очистив кэш.
Заключение
Следуя вышеуказанным рекомендациям и обновляя вашу конфигурацию Apache, вы сможете успешно настроить перенаправления для специфических подкаталогов и вернуть пользователям необходимый доступ к вашему контенту. Не забывайте о регулярных проверках вашей конфигурации и логах сервера для обеспечения его корректной работы.