我有一个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
。
答案 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中这样做!