The? в конце адресата (адресаты не являются регулярными выражениями) означает переход в этот пункт назначения без строки запроса.
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://foo.com/oldpage.php?id=54
закончится в
http://new-site.com/newpage-54
«Если строка запроса содержит только идентификатор», а если нет, это верно только для id? – Qiao
RewriteCond% {QUERY_STRING}^id = (. *) $ Означает, что правило применяется только в том случае, если строка запроса соответствует. В этом случае он будет соответствовать любой строке запроса, которая начинается с id = –