I want to do an url redirect to a new domain by retrieving the ID parameter but only taking the first 4 characters. Anyone know how to do this?
For example, an original url:
http://www.original.example/see/news/actualite.php?newsId=be9e836&newsTitle="blablabla"
To :
https://www.new.example/actualites/be9e
I have tested :
RewriteCond %{QUERY_STRING} ^newsId=(.*)$ [NC]
RewriteRule ^$ https://www.new.example/actualites/%1? [NC,L,R]
CodePudding user response:
RewriteCond %{QUERY_STRING} ^newsId=(.*)$ [NC] RewriteRule ^$ https://www.new.example/actualites/%1? [NC,L,R]
There are a couple of problems with this:
The regex
^$
in theRewriteRule
pattern only matches the document root. The URL in your example is/see/news/actualite.php
- so this rule will never match (and the conditions are never processed).The regex
^newsId=(.*)$
is capturing everything afternewsId=
, including any additional URL parameters. You only need the first 4 characters of this particular URL param.
As an aside, your existing condition is dependent on newsId
being the first URL parameter. Maybe this is always the case, maybe not. But it is relatively trivial to check for this URL parameter, regardless of order.
Also, do you need a case-insensitive match? Or is it always newsId
as stated in your example. Only use the NC
flag if this is necessary, not as a default.
Try the following instead:
RewriteCond %{QUERY_STRING} (?:^|&)newsId=([^&]{4})
RewriteRule ^see/news/actualite\.php$ https://www.new.example/actualites/%1 [QSD,R,L]
The %1
backreference now contains just the first 4 characters of the newsId
URL parameter value (ie. non &
characters), as denoted by the regex ([^&]{4})
.
The QSD
flag (Apache 2.4) discards the original query string from teh redirect response. No need to append the substitution string with ?
(an empty query string), as would have been required in earlier versions of Apache.