捕获已编码的斜杠并忽略未编码的斜杠

时间:2015-11-06 00:42:36

标签: php regex .htaccess

我有一个Web应用程序,最近更改了其规范,允许在其某些文档的名称中添加斜杠。结果,我不得不更改我的.htaccess文件以匹配斜杠。但是,问题是我只想匹配编码的斜杠,即catch %2F而不是/

请考虑以下网址:

http://www.example.com/document/edit/STAT%2F12/

我的.htaccess看起来像:

RewriteRule ^document\/([a-z0-9-]+)?\/?([a-z0-9-\W\s]+)?\/?$ documents.php?request=$1&id=$2& [NC,QSA,L]

上述请求会抓取$id作为' STAT / 12 /'而不是' STAT / 12'。换句话说,它匹配尾部斜杠,即使它没有被编码。

请注意,我已开启AllowEncodedSlashes On

1 个答案:

答案 0 :(得分:1)

那是因为正则表达式RewriteEngine On RewriteCond \/(\?page=) RewriteRule (\/\?page=)(.*) \/\?page=contact 的部分正在捕捉斜线。如果Apache支持它,请使用非贪婪捕获,或使用不同的字符类。

[a-z0-9-\W\s]

非贪婪或懒惰捕获是RewriteRule ^document\/([a-z0-9-]+)?\/?([a-z0-9-\W\s]+?)?\/?$ documents.php?request=$1&id=$2& [NC,QSA,L] 之后的?,并且会捕获尽可能少的字符,因此它会在尾随+之前停止。

https://regex101.com/r/uK8zM3/1

URL编码的内容将以编码的形式到达您的服务器,因此,如果您只需要捕获之前不存在的%2F,那么除了之前的工作之外,只需允许/。你上面的角色类允许使用空格,例如,我认为你不想在URL中这样做!