Laravel 5.5中如何在URL验证中允许%符号通过?
解决Laravel路由参数包含%符号(及URL编码字符)的问题
兄弟,我先帮你理清问题的根源:你遇到的问题其实不是%符号本身不被匹配,而是浏览器会自动把URL里的%xx编码转换成对应的字符。比如你测试URL里的%2F,浏览器会解码成/,而/是Laravel路由的默认分隔符——这就导致你的参数被截断,同时你的正则规则里没包含/,所以匹配失败。你去掉%之后,%2F变成了2F,参数里没有/,自然就能匹配上了。
下面分两种情况给你解决方案:
情况1:你需要参数里包含URL编码后的字符(比如%2F对应实际的/)
如果你的实际需求是允许参数里包含像/这样的字符(通过URL编码成%2F传递),那你需要让Laravel允许参数里包含/,因为默认路由会把/当成路由分段符。
最简单的方案是用通配符正则匹配所有字符(包括
/):Route::get('/delete/{var}', 'MyController@delete')->where('var', '.*');注意:一定要把这个路由放在所有其他路由的后面,否则会覆盖其他路由的匹配逻辑。
如果你想更精确地限制参数范围(比如只允许字母、数字、
-、.、/),可以用这个正则:Route::get('/delete/{var}', 'MyController@delete')->where('var', '[A-Za-z0-9\-\.\/]+');
情况2:你需要参数里包含原始的%符号(不是URL编码的开头)
如果你的参数本身就需要包含%(比如参数是something.com%html),那浏览器会把%编码成%25再发送到服务器,这时候Laravel收到的参数里是%,你的正则其实是有效的——只是你之前的测试URL用的是%2F(对应/),不是%25(对应%)。
正确的正则不需要转义%(因为%在正则里不是特殊字符),直接用:
Route::get('/delete/{var}', 'MyController@delete')->where('var', '[A-Za-z0-9\-\.%]+');
请求的时候,要把参数里的%编码成%25,比如正确的URL应该是domain.tld/delete/something.com%25html。
内容的提问来源于stack exchange,提问作者manifestor
相关产品推荐
相关产品推荐

