Categories: php, apache, nginx, url, url-rewriting

Rewrite URL to specifi query parts Nginx

1 answer

I have got a situation where I want to rewrite the following URLs and send my first URL parameter as data parameter and rest as query parameter      //Skip - Do Nothing because its a file from root          //anything == ?data=$1       //something == ?data=$1    b == &query=$2     //certainly == ?data=$1    b/c == &query=$2  //anything ==  ?data=$1    b/c.jpg == &query=$2         //but ==       ?data=$1    b/c/d == &query=$2 

so my first URL parameter will always be data and rest as query no matter what it has. I found this question here htaccess redirect only if it has value after forward slash and got it to some extent like

rewrite ^/(.*)/(.+)$ /handle.php?data=$1&query=$2 last; 

It has some problems as this rewrites into following      //Results in 404 Not Found          //Results in 404 Not Found       //Working good     //data=certainly/b    query=c  //data=certainly/b    query=c.jpg         //data=but/b/c        query=d 

I tried playing around with different variations in rewrite ^/(.*)/(.+)$ /handle.php?data=$1&query=$2 last; but nothing worked

Received answer to this question:
The best answer according to the author of the question:

So that I can prove the regex matching outcomes, I'll demonstrate with preg_replace(), but the pattern should seamlessly translate to your script.

Code: (Demo)

$urls = [     '',      //Skip - Do Nothing because its a file from root     '',          //anything == ?data=$1     '',       //something == ?data=$1    b == &query=$2     '',     //certainly == ?data=$1    b/c == &query=$2     '',  //anything ==  ?data=$1    b/c.jpg == &query=$2     '',         //but ==       ?data=$1    b/c/d == &query=$2 ];  var_export(     preg_replace('~www\.example\.com/(?![^/]+\.jpg)([^/]+)(?:/(.+))?~', '$1&query=$2', $urls) ); 


array (   0 => '',   1 => '',  // note the empty query value   2 => '',   3 => '',   4 => '',   5 => '', ) 

Using a negated character class containing the slash for the first capture group will permit greedy (speedy) matching without matching too much.

The negative lookahead prevents matching a jpg file.

The second capture group is optional, so unless you want to write a separate pattern to match data-only urls, you'll need to tolerate the empty assignment.