RewriteCond %{QUERY_STRING} ^id=(.*)$ RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1 [R=301,L] and RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1? [R=301,L]
В первом случае результат new-site.com/newpage-3?id=3 в секунду new-site.com/newpage-3
Что означает вопросительный знак во втором правиле перезаписи?
? в конце пункта назначения (пункты назначения не являются регулярными выражениями) означает переход к этому месту назначения без строки запроса.
RewriteCond %{QUERY_STRING} ^id=(.*)$ RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1 [R=301,L]
Если строка запроса содержит только идентификатор, она сохраняет значение, которое затем используется в месте назначения, поэтому, если у вас есть
http://foo.com/oldpage.php?id=54
вы получите
http://new-site.com/newpage-54?id=54
Если у вас есть
RewriteCond %{QUERY_STRING} ^id=(.*)$ RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1? [R=301,L]
Вы отправитесь в тот же пункт назначения, но с пустой строкой запроса, поэтому перейдите к
закончится в
http://new-site.com/newpage-54