Удалите параметр utm_source и замените индекс на htaccess - PullRequest
1 голос
/ 20 января 2020

я пытаюсь удалить параметр utm_source и после этого заменить любой запрос моим index2.html файлом.

Это то, что я пробовал:

# BEGIN
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} "utm" [NC]
RewriteRule ^(.*)?$ "index2.html$1" [QSA,L]
RewriteRule (.*) /$1? [R=301,L,QSD]
<IfModule mod_rewrite.c>
# END

С помощью этой строки кода я удаляю параметр utm_source:

RewriteRule (.*) /$1? [R=301,L,QSD]

Я хочу использовать эту строку кода RewriteRule ^(.*)?$ "index2.html$1" [QSA,L], а затем удалить параметр utm_source, но я не смог сделай это.

Хуже того, мне удалось сделать только одну вещь за раз. Если вы удаляете параметр, не делайте другого.

1 Ответ

1 голос
/ 21 января 2020

Если ваш .htaccess файл находится в документе root ...

Чтобы удалить только URL-параметр utm_source (а не все параметры), вы можете что-то сделать как сначала:

RewriteCond %{QUERY_STRING} ^(.*)&?utm_source=[^&]*&?(.*)$
RewriteRule (.*) /$1?%1%2 [R=302,L]

Затем, чтобы переписать все запросы в index2.html, вы должны сделать что-то вроде следующего (при условии, что вы не хотите также переписывать запросы для существующих файлов):

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index2.html [L]

Однако в своей директиве вы не просто переписываете на index2.html, вы также пытаетесь добавить дополнительную информацию о путевом имени (path-info) - требуется ли это? Хотя в вашем коде вам не хватает sla sh (при использовании в .htaccess), поэтому перезапись будет искажена и приведет к 404. Если вам нужна информация о пути, измените последний RewriteRule на:

RewriteRule (.*) index2.html/$1 [L]

Сводка

RewriteEngine On

# Remove the "utm_source" URL parameter
RewriteCond %{QUERY_STRING} ^(.*)&?utm_source=[^&]*&?(.*)$
RewriteRule (.*) /$1?%1%2 [R=302,L]

# Rewrite all requests to "index2.html"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) index2.html [L]

Нет необходимости в оболочке <IfModule>, так как ваш код предположительно не будет работать без mod_rewrite? Также нет необходимости в директиве RewriteBase, если файл .htaccess находится в документе root.


RewriteCond %{QUERY_STRING} "utm" [NC]
RewriteRule ^(.*)?$ "index2.html$1" [QSA,L]
RewriteRule (.*) /$1? [R=301,L,QSD]

Существует ряд проблем с вашим текущим директивы. Выделенная пара ...

  • Правила расположены в неправильном порядке, поскольку условие, которое проверяет строку запроса, применяется только к первому следующему RewriteRule. Следовательно, последнее RewriteRule (то есть «удаляет параметр utm_source») выполняется безоговорочно и приведет к перенаправлению l oop.

  • Первое правило (которое переписывается на index2.html$1) будет выполняться только в том случае, если в строке запроса (где-либо) присутствует «utm» (он не удален). Но index2.html$1 приведет к неправильной перезаписи в .htaccess (как упомянуто выше - вы пропускаете sla sh).

  • Ваше последнее правило удаляет всю строку запроса, а не только параметр utm_source. Тем не менее, ваше первое правило пытается добавить строку запроса в переписанный запрос.

...