Как в htaccess написать RewriteRule (RewriteRule), который действует только при определенных условиях (RewriteCond)?

Если запрос для www.website.com/index.php, я хочу, чтобы www.website.com/login/index.php отображалось. Но ЕСЛИ запрос для www.website.com/index.php?any-query, я хочу, чтобы www.website.com/index.php?any-query отображалось. Другими словами, если URL-адрес содержит какой-либо запрос, он отвечает именно на этот адрес. В противном случае все должно проходить через index.php в каталоге /login/. Надеюсь, я объяснил себя более понятно. Спасибо.

ИЗМЕНИТЬ для большей ясности

Я объясняю, как выглядит проблема. Когда я нажимаю на тег <a href="http://www.website.com/index.php?r=adm/lostpwd"></a> (в файле /login/index.php), он отвечает http://www.website.com/login/index.php?r=adm/lostpwd, вместо этого я хотел бы, чтобы он отвечал именно http://www.website.com/index.php?r=adm/lostpwd

EDIT 2 ››› Текущий файл /.htaccess:

RewriteEngine On
RewriteCond %{THE_REQUEST} \s/+(?:index\.php)?\sHTTP [NC]
RewriteRule ^ /login/index.php [R=301,L]

Анализ текущих переадресаций

Текущая ситуация следующая. Когда я захожу на сайт site.com

  1. 301 https://website.com/ server_redirect permanent https://website.com/login/index.php
  2. 200 https://website.com/login/index.php

На странице /login/index.php, когда я нажимаю <a href="http://website.com/index.php?r=adm/lostpwd"></a>

  1. 301 http://website.com/index.php?r=adm/lostpwd server_redirect permanent https://website.com/index.php?r=adm/lostpwd
  2. 200 https://website.com/index.php?r=adm/lostpwd

Когда я отправляю форму на странице /login/index.php, создается ссылка для единого входа (header("Location: " . $link);). Это сгенерированный трафик:

  1. 302 https://website.com/login/index.php server_redirect temporary https://website.com/index.php?r=adm/sso&login_user=username&time=1000&token=abcde
  2. 302 https://website.com/index.php?r=adm/sso&login_user=username&time=1000&token=abcde server_redirect temporary https://website.com/index.php
  3. 301 https://website.com/index.php server_redirect permanent https://website.com/login/index.php
  4. 200 https://website.com/login/index.php

В /login/index.php:

Это генерация ссылки для единого входа

if (password_verify($password_entered, $password)) {
    $time = time();
    $key = "abcde";
    $token = "abcde";
    $link = "https://www.website.com/index.php?r=adm/sso&login_user=".$user."&time=".$time."&token=".$token;
    header("Location: " . $link);
    exit;
}

person marco987    schedule 04.11.2020    source источник
comment
@anubhava Если я прокомментирую, перенаправление больше не будет работать так, как я хочу.   -  person marco987    schedule 04.11.2020
comment
Только случай 3 выше обрабатывается предложенным мной правилом. Варианты 1 и 2 выполняются с помощью кода PHP. Теперь, пожалуйста, уточните, какой случай вызывает проблемы и каково желаемое поведение.   -  person anubhava    schedule 04.11.2020
comment
@anubhava Пожалуйста, посмотрите, как я изменил Анализ текущих переадресаций   -  person marco987    schedule 04.11.2020
comment
Я считаю, что ваш href должен быть: <a href="https://website.com/index.php?r=adm/lostpwd"></a>   -  person anubhava    schedule 04.11.2020
comment
Также случай № 2 в последнем разделе, то есть 302 https://website.com/index.php?r=adm/sso&login_user=username&time=1000&token=abcde server_redirect temporary https://website.com/index.php, является загадкой, потому что показанный код PHP отличается. Есть другой код PHP, который делает это   -  person anubhava    schedule 04.11.2020
comment
Нет @anubhava, сгенерированная ссылка $работает отлично, если я прокомментирую то, что написано в .htaccess. Нет PHP-кода, который делал бы что-то еще. Вы просто вводите свое имя пользователя и пароль на странице, и PHP-скрипт генерирует ссылку SSO.   -  person marco987    schedule 04.11.2020
comment
Давайте продолжим обсуждение в чате.   -  person marco987    schedule 04.11.2020


Ответы (1)


Вы можете использовать этот простой код в корне сайта .htaccess:

RewriteEngine On

RewriteCond %{THE_REQUEST} \s/+(?:index\.php)?\sHTTP [NC]
RewriteRule ^ /login/index.php [R=301,L]

Убедитесь, что в этом .htaccess нет другого правила и нет .htaccess в каталоге login/.

person anubhava    schedule 04.11.2020
comment
Извините, @anubhava :( Ссылка http://www.website.com/login/index.php?r=adm/lostpwd перенаправляется хорошо. А вот следующая - нет: http://website.com/index.php?r=adm/sso&login_user=xxx&time=xxx&token=abc - person marco987; 04.11.2020
comment
http://website.com/index.php?r=adm/sso&login_user=xxx&time=xxx&token=abc останется без изменений с указанным выше правилом. Протестируйте в новом браузере. Также вы можете комментировать здесь в любое время, и я отвечу, нет необходимости удалять знак принятия - person anubhava; 04.11.2020
comment
Прошу прощения за знак принятия. Последняя ссылка не работает, к сожалению. Это достигается не щелчком по тегу, а с помощью header("Location: ". $link) в php - person marco987; 04.11.2020
comment
Извините, но, пожалуйста, закомментируйте header("Location:". $link) код, так как мы полностью обрабатываем перенаправления в .htaccess. Если он предназначен для конкретной цели, я предлагаю вам показать рассматриваемый php-код и пояснить эту специальную логику. - person anubhava; 04.11.2020
comment
Посмотрите, как я изменил Анализ текущих переадресаций. - person marco987; 04.11.2020
comment
Анубхава, пожалуйста, если можешь, посмотри чат. Спасибо - person marco987; 10.11.2020
comment
@marco987: Разместите здесь ссылку на чат - person anubhava; 10.11.2020
comment
chat.stackoverflow.com/rooms/224104/ - person marco987; 10.11.2020