Reputation: 1161
I want to convert the url
https://example.com/?city=FLorida&type=America&date=2019-06-06-15:15
to
https://example.com/Florida/America/06-june-2019-1515
Use nginx as a proxy to serve the first url when user request the second url.
Upvotes: 1
Views: 34
Reputation: 49702
The difficulty is translating the month names into numbers, which is solved using a map
with 12 regular expressions. See this document for details.
The first example does everything in the map
. I have used a redirect to test it, as I don't know how you intend to process the rewritten URI internally.
map $uri $newuri {
default 0;
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-jan(uary)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-01-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-feb(ruary)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-02-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-mar(ch)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-03-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-apr(il)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-04-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-may-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-05-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-june?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-06-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-july?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-07-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-aug(ust)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-08-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-sep(tember)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-09-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-oct(ober)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-10-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-nov(ember)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-11-$day $hour:$min";
~*^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-dec(ember)?-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$
"/?city=$city&type=$type&date=$year-12-$day $hour:$min";
}
server {
...
if ($newuri) { return 302 $newuri; }
...
}
Alternatively, just using the map
to translate the month names:
map $month $month_num {
~*^jan(uary)?$ "01";
~*^feb(ruary)?$ "02";
~*^mar(ch)?$ "03";
~*^apr(il)?$ "04";
~*^may$ "05";
~*^june?$ "06";
~*^july?$ "07";
~*^aug(ust)?$ "08";
~*^sep(tember)?$ "09";
~*^oct(ober)?$ "10";
~*^nov(ember)?$ "11";
~*^dec(ember)?$ "12";
}
server {
...
if ($uri ~* ^/(?<city>\w+)/(?<type>\w+)/(?<day>\d\d)-(?<month>\w+)-(?<year>\d\d\d\d)-(?<hour>\d\d)(?<min>\d\d)$)
{
return 302 "/?city=$city&type=$type&date=$year-$month_num-$day $hour:$min";
}
...
}
See this caution on the use of if
.
Upvotes: 1