У меня есть URL как так:
Я пытаюсь удалить следующую переменную запроса из строки запроса в URL IP=169%2E59%2E201%2E137 при оставлении остальной части строки неповрежденной. Та переменная является IP-адресом, который может быть другим IP-адресом каждый раз, но всегда будет IP. Одна из систем CMS, которые я использую, будет ошибка, если IP-адрес будет найден в строке запроса из соображений безопасности. К сожалению, я должен был отправить данные от платежного шлюза, и нет никакого пути в шлюзе для выключения IP-адреса, который это отправляется от них. Если я должен собрать данные, отправленные на мой CMS, то у меня должен быть IP в запросе удаленное или замененное использование HTACCESS.
RewriteEngine On
RewriteCond %{THE_REQUEST} ^GET\ /.*\ HTTP/ [NC]
RewriteCond %{QUERY_STRING} IP= [NC]
RewriteCond %{QUERY_STRING} (.*)(IP=[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3})(.*) [NC]
RewriteRule .* %{REQUEST_URI}?%1%3 [R=301,L]
Так, я начал писать что-то вроде этого, но честно я сосу в mod_rewrite и регулярных выражениях.
Я не забочусь, установлено ли это на IP=123 или просто удалено, но это не может быть отформатировано как IP. Сообщите мне, можно ли помочь!
РЕДАКТИРОВАТЬ: Это на самом деле неверно и не сработает. Я не собираюсь его менять, потому что ответ Cags уже решает проблему, поэтому, пожалуйста, просто проигнорируйте это.
Ваша проблема в том, что % {REQUEST_URI}
включает значения GET. Итак, в конце вы просто добавляете все, кроме IP, в конец снова, но IP все еще там. Кроме того, вам не нужны все эти условия. Вы должны уметь делать все с помощью одного правила, например:
RewriteEngine on
RewriteRule ^(.*)(IP=[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3}%252E[0-9]{1,3})(.*)$ $1$3
Дайте мне знать, работает ли это для вас.
Я не уверен насчет ваших первых двух RewriteConds, но что-то вроде этого должно работать ...
RewriteCond %{QUERY_STRING} (.*)IP=\d{1,3}%2E\d{1,3}%2E\d{1,3}%2E\d{1,3}&(.*) [NC]
RewriteRule ^(.*)$ /$1?%1%2 [R=302,L]
Это предполагает, что всегда будет параметр после IP-адреса, если это не так, вы можете удалить &, но тогда вы получите двойные амперсанды. Вы всегда можете переместить его до IP, если ему всегда предшествует значение. В любом случае я предполагаю, что любая используемая вами услуга является довольно стандартной.
NB: Я всегда использую 302 в целях тестирования, поскольку после кеширования форварда в браузере могут возникнуть трудности с тестированием изменений. Как только он заработает, верните его на 301.