Laravel中fullUrlWithQuery自动添加_token字段的原因及解决方法
fullUrlWithQuery会自动添加_token? 这个问题的核心原因很明确:fullUrlWithQuery()方法的设计逻辑是保留当前请求中已有的所有查询参数,再合并你传入的新参数。如果你的当前页面请求(比如刚提交过表单后跳转过来,或者当前URL本身就携带了_token)的查询参数里已经包含_token,这个方法就会默认把它带到新生成的URL里。
正常来说Laravel的CSRF Token是通过POST表单的隐藏字段传递的,但如果你的请求是通过GET方式带上了_token(比如某些不规范的跳转逻辑),它就会被包含在当前请求的查询参数中,进而被fullUrlWithQuery()继承。
_token? 这里有两种靠谱的解决方法,你可以根据自己的需求选择:
方法一:过滤原有参数后再合并
先把当前请求里的_token参数剔除,再和你要添加的新参数合并,最后生成URL:
<li> <a href="{{ request()->fullUrlWithQuery( array_merge(request()->query()->except('_token'), ['price' => 'low-high']) ) }}"> Low-High </a> </li>
request()->query()->except('_token')会获取当前请求中除_token外的所有查询参数,再和price参数合并,这样生成的URL就不会包含多余的_token了,同时还能保留其他你需要的原有参数。
方法二:直接基于当前路径构建URL
如果你不需要保留当前请求的其他查询参数,完全可以直接用当前页面的基础URL,手动拼接新的查询参数:
<li> <a href="{{ url()->current() . '?' . http_build_query(['price' => 'low-high']) }}"> Low-High </a> </li>
这种方式更简洁,适合只需要添加price参数、不需要保留其他原有查询参数的场景。
额外建议
如果_token是意外出现在当前请求的URL里,建议检查一下页面的表单提交逻辑——规范的做法是CSRF Token通过POST请求的表单字段传递,而不是出现在GET请求的URL中。从根源上避免GET请求携带_token,也能彻底解决这个问题。
内容的提问来源于stack exchange,提问作者user7747472

