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

#apache #.htaccess #mod-rewrite #url-rewriting

#apache #.htaccess #mod-перезапись #url-перезапись

Вопрос:

Если запрос предназначен для 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 , создается ссылка для единого входа ( header("Location: " . $link); ). Это генерируемый трафик:

  1. 302 https://website.com/login/index.php server_redirect temporary https://website.com/index.php?r=adm/ssoamp;login_user=usernameamp;time=1000amp;token=abcde
  2. 302 https://website.com/index.php?r=adm/ssoamp;login_user=usernameamp;time=1000amp;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/ssoamp;login_user=".$user."amp;time=".$time."amp;token=".$token;
    header("Location: " . $link);
    exit;
}
  

Комментарии:

1. @anubhava Если я прокомментирую, перенаправление больше не будет работать так, как я хочу

2. Только случай 3 выше обрабатывается моим предложенным правилом. Случаи 1 и 2 управляются с помощью PHP-кода. Теперь, пожалуйста, уточните, какой случай вызывает проблемы и каково желаемое поведение.

3. @anubhava Пожалуйста, посмотрите, как я изменил анализ текущих перенаправлений

4. Я считаю, что ваш href должен быть: <a href="https://website.com/index.php?r=adm/lostpwd"></a>

5. Также случай № 2 в последнем разделе, т.Е. 302 https://website.com/index.php?r=adm/ssoamp;login_user=usernameamp;time=1000amp;token=abcde server_redirect temporary https://website.com/index.php Является загадкой, потому что показанный PHP-код отличается. Есть какой-то другой PHP-код, который делает это

Ответ №1:

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

 RewriteEngine On

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

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

Комментарии:

1. Извините @anubhava : ( http://www.website.com/login/index.php?r=adm/lostpwd Ссылка перенаправляется хорошо. Но следующее не: http://website.com/index.php?r=adm/ssoamp;login_user=xxxamp;time=xxxamp;token=abc

2. http://website.com/index.php?r=adm/ssoamp;login_user=xxxamp;time=xxxamp;token=abc останется неизменным в соответствии с приведенным выше правилом. Протестируйте в новом браузере. Также вы можете прокомментировать здесь в любое время, и я бы ответил, нет необходимости удалять знак принятия

3. Я прошу прощения за знак принятия. К сожалению, последняя ссылка не работает. Это достигается не щелчком по тегу a, а с header("Location: ". $link) помощью php

4. Извините, но, пожалуйста, закомментируйте header("Location:". $link) код, поскольку мы полностью обрабатываем перенаправления в .htaccess. Если она существует для определенной цели, я предлагаю вам показать рассматриваемый php-код и разъяснить эту особую логику.

5. Пожалуйста, посмотрите, как я изменил анализ текущих перенаправлений