Вот что я придумала:
RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3 [I,RP,L]
который, я думаю, работает. квалификаторы lookAhead / lookbehind (? <= и (? =), по-видимому, являются ключом к тому, чтобы я мог искать охватывающее & или?, не «поглощая его», чтобы испортить следующее совпадение. </p>
Одна ошибка в том, что если в старом URL страницы есть только три параметра, у меня все равно останется трейлинг? без параметров в перенаправленном URL, "/newpage.htm?". В настоящее время я планирую избежать этого, используя RewriteCond для просмотра только URL-адресов с 4+ параметрами до этого срабатывания, и использую более простое регулярное выражение для тех, у которых ровно три .. поэтому полный набор правил:
RewriteCond URL ^/oldpage.htm\?([^#]\*=[^#]\*&){3,}[^#]\*=[^#]\*.\*
RewriteRule ^/oldpage.htm\?(.\*)(?<=\?|&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:abc=123&|def=456&|ghi=789&)(.\*)(?<=&)(?:(?:abc=123|def=456|ghi=789)(?:&|#|$))(.\*) /newpage.htm?$1$2$3 [I,RP,L]
RewriteRule ^/oldpage.htm\?(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)&(?:abc=123|def=456|ghi=789)(.\*) /newpage.htm$1 [I,RP,L]
($ 1 в конце для # дополнений к URL-адресу ... действительно ли мне это нужно?) Другая проблема, я полагаю, URL /oldpage.htm?abc=123&abc=123&abc=123 вызовет , но я не вижу никакого легкого пути обойти это, и я не слишком беспокоюсь об этом ..
Может кто-нибудь придумать лучший способ подойти к этому или увидеть какие-либо другие проблемы?