rewrite and replace value of a get param inside url
what I want in address bar -
example.com/blue-sky
Assuming you have already changed your internal links to this desired canonical URL then you can implement the following in .htaccess
to externally redirect /index.php?c=bs
(or /?c=bs
) to /blue-sky
for the benefit of SEO. Followed by a rewrite to internally rewrite requests for /blue-sky
back to /index.php?c=bs
.
For example (assuming you are on Apache 2.4):
RewriteEngine On
# Redirect "/index.php?c=bs" (or "/?c=bs") to "/blue-sky"
RewriteCond %{QUERY_STRING} ^c=bs$
RewriteRule ^(index\.php)?$ /blue-sky [QSD,R=301,L]
# Rewrite (internally) "/blue-sky" back to "/index.php?c=bs"
RewriteRule ^blue-sky$ index.php?c=bs [QSA,END]
The QSD
flag on the first rule is required to discard the original query string (ie. c=bs
) from the redirect response. Otherwise, it will redirect to /blue-sky?c=bs
. This requires Apache 2.4
The QSA
flag on the second rule allows any additional query string parameters that might be present on the initial request being appended. eg. /blue-sky?foo=1
would be rewritten to index.php?c=bs&foo=1
. If that is not required and you are not expecting any additional query string then remove the QSA
flag.
The END
flag (as opposed to L
) prevents any further loops by the rewrite engine and thus prevents the rewritten URL being redirected back to the canonical URL (which would otherwise result in an endless redirect loop). The END
flag requires Apache 2.4.
A look at your directives:
RewriteCond %{THE_REQUEST} \?c=bs [NC] RewriteRule ^ %1? [R=301,L,NE] RewriteRule ^([^/.]+)/?$ ?c=blue-sky [L,QSA]
The first rule would essentially redirect /<anything>?c=bs
back to the document root, except that the %1
backreference is empty and without a RewriteBase
directive, this will result in a malformed redirect, exposing the absolute filesystem directory.
The second rule rewrites /<anything>
to ?c=blue-sky
, which should presuambly be c=bs
(but that would result in a redirect loop since the rewrite engine starts over with the use of L
, rather than END
).