Правило переписывания Apache игнорирует всё после / для одного правила

Вопрос или проблема

У меня есть веб-сервер за балансировщиком нагрузки 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>

Описание проблемы

  1. Проблема с регулярным выражением в LocationMatch: В вашем первом LocationMatch для порта 443, регулярное выражение ^(?=/subfolder-to-check)/[^/]* имеет ошибку. Оно направлено на поиск соответствий, но может не проверять корректно весь путь URL, и поэтому $1 оказывается пустым.

  2. Необходимо уточнение правил: Следует убедиться, что все части пути к 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, вы сможете успешно настроить перенаправления для специфических подкаталогов и вернуть пользователям необходимый доступ к вашему контенту. Не забывайте о регулярных проверках вашей конфигурации и логах сервера для обеспечения его корректной работы.

Оцените материал
Добавить комментарий

Капча загружается...