Проблема с RewriteRule и исключением в приложении codeigniter - PullRequest
1 голос
/ 04 августа 2020

У меня проблема с файлом .htaccess.

Раньше у нас был основной домен ie: co.example.com, а недавно мы перешли на www.example.com. Поэтому мы добавили правило перезаписи для перенаправления co.example.com/* в www.example.com/*.

Проблема в том, что у нас есть служба, работающая на co.example.com/api/*, которая должна оставаться активной, поэтому я добавил исключение для перенаправления

  RewriteCond %{REQUEST_URI} !^api/(.*) [NC]

Но независимо от того, как я его меняю Apache всегда выполняет перенаправление 301 на www.example.com/index.php/api/*

, что превращается в проблему, так как служба y вызывается через запрос POST и выполняется перенаправление на GET.

Это образец файла .htaccess.

  RewriteEngine On
  RewriteBase /

  RewriteCond %{HTTP_HOST} !^www.example.com [NC]
  RewriteCond %{REQUEST_URI} !^api/(.*) [NC]
  RewriteRule ^(.*) https://www.example.com/$1 [L,R=301]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^.*$ index.php [L]

В чем может быть проблема с этим правилом? Сервер Apache работает за прокси Nginx, может ли это быть проблемой?

Я не могу изменить сторонний код так, чтобы он указывал на www.example.com/api/* в краткосрочной перспективе, поэтому мне понадобится чтобы решить эту проблему с помощью .htaccess, если возможно.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 04 августа 2020
RewriteCond %{REQUEST_URI} !^api/(.*) [NC]

Значением серверной переменной REQUEST_URI является полный URL-путь, который включает префикс sla sh, поэтому регулярное выражение должно быть !^/api/ (конечная группа захвата (.*) казалось бы лишним). В противном случае это условие всегда было бы успешным.

Вместо этого вы также можете использовать RewriteRule шаблон , который соответствует URL-пути без префикса sla sh (фактически, это меньше префикса каталога ). Это было бы немного более эффективно, поскольку оно обрабатывается первым и сохраняет дополнительное условие:

RewriteCond %{HTTP_HOST} !^www\.example\.com
RewriteRule !^api/ https://www.example.com%{REQUEST_URI} [L,R=301]

Поскольку мы больше не захватываем URL-путь из RewriteRule шаблона , мы необходимо использовать серверную переменную REQUEST_URI вместо подстановки строки.

Вам необходимо очистить кеш браузера перед тестированием. Желательно сначала протестировать с 302 (временным) перенаправлением, чтобы избежать проблем с кешированием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...