Как перенаправить 301 с динамически сгенерированным URL при удалении косой черты? - PullRequest
0 голосов
/ 12 января 2019

Я занимался этим целый день, перепробовал десятки вариантов, но не могу заставить этот переписать работать.

RewriteCond %{THE_REQUEST} /pwreset\.php\ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ https\:\/\/www\.example\.com\/support\/pwreset\.php [L]

URL-адрес, который он возвращает:

https://www.web-jive.com/support/pwreset.php/?key=cdc3b1aa842785f7345be501a30ddc83

Мне нужно удалить косую черту pwrest.php перед знаком вопроса. Куда я в этом ошибаюсь?

Идея состоит в том, чтобы иметь первый URL ниже, перенаправить на второй:

https://example1.com/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

https://example2.com/support/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

EDIT

По предложению мистера Уайта, я публикую весь файл .htaccess.

RewriteEngine On

# Announcements
RewriteRule ^announcements/([0-9]+)/[a-z0-9_-]+\.html$ ./announcements.php?id=$1 [L,NC]
RewriteRule ^announcements$ ./announcements.php [L,NC]

# Downloads
RewriteRule ^downloads/([0-9]+)/([^/]*)$ ./downloads.php?action=displaycat&catid=$1 [L,NC]
RewriteRule ^downloads$ ./downloads.php [L,NC]

# Knowledgebase
RewriteRule ^knowledgebase/([0-9]+)/[a-z0-9_-]+\.html$ ./knowledgebase.php?action=displayarticle&id=$1 [L,NC]
RewriteRule ^knowledgebase/([0-9]+)/([^/]*)$ ./knowledgebase.php?action=displaycat&catid=$1 [L,NC]
RewriteRule ^knowledgebase$ ./knowledgebase.php [L,NC]

#Password reset
RewriteCond %{QUERY_STRING} ^key=[0-9a-f]{32}$
RewriteRule ^pwreset\.php$ https://www.web-jive.com/support%{REQUEST_URI} [R=302,L]

#Redirect to new support URL
RewriteCond %{HTTP_HOST} ^members\.web\-jive\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.members\.web\-jive\.com$
RewriteRule ^/?$ "https\:\/\/www\.web\-jive\.com\/support" [R=301,L]
RewriteCond %{HTTP_HOST} ^members\.web\-jive\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.members\.web\-jive\.com$

1 Ответ

0 голосов
/ 12 января 2019

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

Однако опубликованное вами правило может показаться намного более сложным, чем необходимо.

1. https://example1.com/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83
2. https://example2.com/support/pwreset.php?key=cdc3b1aa842785f7345be501a30ddc83

Предположения:

  • Вам не нужно совпадать со значением key; просто URL-путь (т.е. /pwreset.php)
  • example1.com и example2.com указывают на разные места (файловая система не перекрывается).

Чтобы перенаправить с 1. на 2., попробуйте следующее в верхней части файла .htaccess в корне example1.com:

RewriteEngine On

RewriteRule ^pwreset\.php$ https://example2.com/support%{REQUEST_URI} [R=302,L]

Любая строка запроса (например, key=abc...) передается без изменений.

Обратите внимание, что это 302 (временное) перенаправление. Измените его на 301 (постоянный), только если вы подтвердили, что он работает нормально.


Если вам нужно проверить, что параметр URL key= присутствует и имеет значение 32 шестнадцатеричной строки (что, по-видимому, соответствует вашему примеру), то включите условие перед RewriteRule, которое проверяет соответствие QUERY_STRING переменная сервера. Например:

RewriteCond %{QUERY_STRING} ^key=[0-9a-f]{32}$
RewriteRule ^pwreset\.php$ https://example2.com/support%{REQUEST_URI} [R=302,L]

Если в запросе присутствуют другие параметры URL, перенаправление не будет выполнено.


За исключением:

RewriteRule ^(.+?)/$ https\:\/\/www\.example\.com\/support\/pwreset\.php [L]

Это выглядит очень в стиле cPanel. В аргументе RewriteRule susbtitution нет необходимости использовать обратную косую черту, косую черту и точки. Это «обычная» строка, а не регулярное выражение. Эти символы не имеют особого значения здесь.

...