我遇到一种情况,我想重写以下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] 删除。
我来说两句