В htaccess, как да напиша Rewrite (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

РЕДАКТИРАНЕ 2 ››› Текущ /.htaccess:

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

Анализ на текущи пренасочвания

Сегашната ситуация е следната. Когато посещавам website.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, се генерира връзка за SSO (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, генерираната $link работи перфектно, ако коментирам написаното в .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
Извинявам се за знака за приемане. Последният линк не работи за съжаление. До него не се стига с щракване върху тага a, а с 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
anubhava моля те, ако можеш гледай чата. Благодаря - person marco987; 10.11.2020
comment
@marco987: Моля, публикувайте връзка за чат тук - person anubhava; 10.11.2020
comment
chat.stackoverflow.com/rooms/224104/ - person marco987; 10.11.2020