重写URL以指定查询部分Nginx

通风的

我遇到一种情况,我想重写以下URL,并发送我的第一个URL参数作为data参数,其余的作为query参数

www.example.com/anything.jpg      //Skip - Do Nothing because its a file from root
www.example.com/anything          //anything == ?data=$1
www.example.com/something/b       //something == ?data=$1    b == &query=$2
www.example.com/certainly/b/c     //certainly == ?data=$1    b/c == &query=$2
www.example.com/anything/b/c.jpg  //anything ==  ?data=$1    b/c.jpg == &query=$2
www.example.com/but/b/c/d         //but ==       ?data=$1    b/c/d == &query=$2

因此我的第一个URL参数将始终保持data不变,query无论它具有什么。我在这里找到了这个问题htaccess重定向,仅当它在正斜杠后具有价值并且在某种程度上使它变得像

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

它有一些问题,因为这被重写为以下内容

www.example.com/anything.jpg      //Results in 404 Not Found
www.example.com/anything          //Results in 404 Not Found
www.example.com/something/b       //Working good
www.example.com/certainly/b/c     //data=certainly/b    query=c
www.example.com/anything/b/c.jpg  //data=certainly/b    query=c.jpg
www.example.com/but/b/c/d         //data=but/b/c        query=d

我尝试玩各种不同的游戏,rewrite ^/(.*)/(.+)$ /handle.php?data=$1&query=$2 last;但没有任何效果

米克马克萨

为了证明正则表达式匹配的结果,我将用进行演示preg_replace(),但是该模式应无缝转换为您的脚本。

代码:(演示

$urls = [
    'www.example.com/anything.jpg',      //Skip - Do Nothing because its a file from root
    'www.example.com/anything',          //anything == ?data=$1
    'www.example.com/something/b',       //something == ?data=$1    b == &query=$2
    'www.example.com/certainly/b/c',     //certainly == ?data=$1    b/c == &query=$2
    'www.example.com/anything/b/c.jpg',  //anything ==  ?data=$1    b/c.jpg == &query=$2
    'www.example.com/but/b/c/d',         //but ==       ?data=$1    b/c/d == &query=$2
];

var_export(
    preg_replace('~www\.example\.com/(?![^/]+\.jpg)([^/]+)(?:/(.+))?~', 'www.example.com?data=$1&query=$2', $urls)
);

输出:

array (
  0 => 'www.example.com/anything.jpg',
  1 => 'www.example.com?data=anything&query=',  // note the empty query value
  2 => 'www.example.com?data=something&query=b',
  3 => 'www.example.com?data=certainly&query=b/c',
  4 => 'www.example.com?data=anything&query=b/c.jpg',
  5 => 'www.example.com?data=but&query=b/c/d',
)

对第一个捕获组使用包含斜杠的否定字符类将允许贪婪(快速)匹配,而不会匹配太多。

负前瞻会阻止匹配jpg文件。

第二个捕获组是可选的,因此除非您要编写单独的模式以匹配data仅url,否则您将需要容忍空的分配。

为了您的目的,我未经测试的建议是:

一个声明:

rewrite ^/(?![^/]+\.jpg)([^/]+)(?:/(.+))?$ /handle.php?data=$1&query=$2 last;

或作为两个声明:

rewrite ^/(?![^/]+\.jpg)([^/]+)$ /handle.php?data=$1 last;
rewrite ^/(?![^/]+\.jpg)([^/]+)/(.+)$ /handle.php?data=$1&query=$2 last;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章