为什么 Symfony 会逃逸?使用 url_for() 时的字符?
在这个 Symfony 页面中,我在 URI 中传递 $_GET
参数,如下所示:
http://www.mysite.com/article?page=4&sort=1
在我的布局中,页面中的某些链接需要包含相同的查询字符串。
无论如何,使用 Symfony 的 url_for()
命令,我会像这样创建 URL:
$url = url_for('article/index?.http_build_query($_GET));
这样它就会使用 $_GET 变量创建一个新的 url。对于某些链接,我会提前更改 $_GET 值,例如在生成网址之前更改 $_GET['sort']=0;
。这就是我使用这种方法的原因。
无论如何,当我查看生成的 URL 时,它现在看起来像这样:
http://www.mysite.com/article?page=4&%3Bsort=1
&%3B
是 &
的编码形式,它只是一个 < code>& 字符。
所以问题是,当我现在在控制器中检查 $_GET 参数时,不再传递 sort
参数。它现在被称为 &%3Bsort
...它导致了各种各样的问题。
两个问题:
如何避免这个问题?我可以解码控制器中的
$_GET
参数键值或其他内容吗?为什么 symfony 首先要编码
&
字符?这是一个完全可以接受的 URI 字符。哎呀,即使是编码值,&%3B
也包含&
!!!
With this Symfony page, I am passing $_GET
parameters in the URI like this:
http://www.mysite.com/article?page=4&sort=1
Once in my layout, there are certain links in the page that need to have the same query string in them.
Anyways, using Symfony's url_for()
command I'm making URLs like so:
$url = url_for('article/index?.http_build_query($_GET));
That way it makes a new url using the $_GET variables. For some of the links I'm changing the $_GET values ahead of time, like $_GET['sort']=0;
before generating the url. That's why I'm using this method.
Anyways, when I look at the generated URL, it now looks like this:
http://www.mysite.com/article?page=4&%3Bsort=1
The &%3B
is the encoded form of &
which is just an &
character.
So the problem is that when I check for my $_GET parameters in my controller now, there is no longer a sort
parameter that is passed. It's now called &%3Bsort
... It's causing all sorts of issues.
Two questions:
How do I avoid this problem? Can I decode the
$_GET
parameter key values in my controller or something?Why is symfony encoding a
&
character in the first place? It's a perfectly acceptable URI character. Heck, even the encoded value,&%3B
contains a&
!!!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我相信,这是因为您的应用程序中的输出转义处于打开状态。因此,$_GET 数组被包装在 sfOutputEscaperArrayDecorator 类中。您可以使用以下方法获取原始值:
$_GET->getRawValue()
。或者您可以使用 sfOutputEscaper::unescape 解码结果查询
希望这会有用。
I believe, it is because of output escaping is ON in your application. As a result, $_GET array is wrapped inside sfOutputEscaperArrayDecorator class. You can get a raw value using this:
$_GET->getRawValue()
.Or you can decode the result query using sfOutputEscaper::unescape
Hope this will be useful.
最好使用 Symfony 自己的方法来获取请求参数。例如,在模板中,使用:
如果必须使用 $_GET,也许可以尝试:
... 来绕过输出转义。不完全确定这是否会按原样工作。
Best if you use Symfony's own method for getting the request parameters. For example, in templates, use:
If you must use $_GET, maybe try:
... to get past the output escaping. Not totally sure if that'll work as is.