为什么 Symfony 会逃逸?使用 url_for() 时的字符?

发布于 2024-11-27 11:25:19 字数 993 浏览 1 评论 0原文

在这个 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&amp%3Bsort=1

&amp%3B&amp; 的编码形式,它只是一个 < code>& 字符。

所以问题是,当我现在在控制器中检查 $_GET 参数时,不再传递 sort 参数。它现在被称为 &amp%3Bsort...它导致了各种各样的问题。

两个问题:

  1. 如何避免这个问题?我可以解码控制器中的 $_GET 参数键值或其他内容吗?

  2. 为什么 symfony 首先要编码 & 字符?这是一个完全可以接受的 URI 字符。哎呀,即使是编码值, &amp%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:

  1. How do I avoid this problem? Can I decode the $_GET parameter key values in my controller or something?

  2. 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

三生池水覆流年 2024-12-04 11:25:19

我相信,这是因为您的应用程序中的输出转义处于打开状态。因此,$_GET 数组被包装在 sfOutputEscaperArrayDecorator 类中。您可以使用以下方法获取原始值:$_GET->getRawValue()

$url = url_for('article/index?.http_build_query($_GET->getRawValue()))

或者您可以使用 sfOutputEscaper::unescape 解码结果查询

$url = url_for('article/index?.sfOutputEscaper::unescape(http_build_query($_GET)));

希望这会有用。

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().

$url = url_for('article/index?.http_build_query($_GET->getRawValue()))

Or you can decode the result query using sfOutputEscaper::unescape

$url = url_for('article/index?.sfOutputEscaper::unescape(http_build_query($_GET)));

Hope this will be useful.

囚我心虐我身 2024-12-04 11:25:19

最好使用 Symfony 自己的方法来获取请求参数。例如,在模板中,使用:

$sf_request->getParameter('some_param');

如果必须使用 $_GET,也许可以尝试:

 (((    $sf_data->getRaw('_GET')   )))

... 来绕过输出转义。不完全确定这是否会按原样工作。

Best if you use Symfony's own method for getting the request parameters. For example, in templates, use:

$sf_request->getParameter('some_param');

If you must use $_GET, maybe try:

 (((    $sf_data->getRaw('_GET')   )))

... to get past the output escaping. Not totally sure if that'll work as is.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文