I am redirecting from domain1 to domain2 based on what's present in the URI, but I need to pass to domain2 only the first part of the last path component.
The main entry point to be redirected would be:
https://www.domain1.com/us/type-a-products/**9011-HWD-bolts-new**
new end point:
https://www.domain2.com/us-us/type-a-products/**9011**
So I need to consider only the first part of the last past component before the first hypen (basically the product code).
The redirect is easy to do:
if ($request_uri ~* "([^/]*$)" ) {
set $last_path_component $1;
}
location ~ /us/type-a-products/(.*) {
return 301 https://www.domain2.com/us-us/type-a-products/$1;
}
But how can I consider only the first part of the last path component (tried different regexs but I only managed to extract the word after the last hyphen).
Any help would be much appreciated!
CodePudding user response:
You can use
([^/-] )[^/]*$
See the regex demo. Details:
([^/-] )
- Group 1: any one or more chars other than/
and-
[^/]*
- any zero or more chars other than/
$
- end of string.
CodePudding user response:
A good place to do this is in a map. It happens early in the nginx cycle and will not short circuit the flow of your config by introducing regex locations.
outside of the server config
map $uri $redirect_id_uri {
~^/us/type-a-products/\*\*(?<id>\d )-.*\*\*$ https://www.domain2.com/us/type-a-products/**$id**;
}
inside server config
if ($redirect_id_uri) {
return 301 $redirect_id_uri;
}