首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel4发布无法解释的重定向

Laravel4发布无法解释的重定向
EN

Stack Overflow用户
提问于 2013-11-28 14:40:19
回答 1查看 4K关注 0票数 6

另一个我没睡够的问题,我敢肯定。我把它作为一种牺牲,作为对大神墨菲的一种牺牲:一旦我把我的愚蠢暴露给所有人看,我肯定会自己找到答案,否则我会躲过几个小时(为了进一步的忏悔,我也会贴出答案)。

我有一个HTML表单,它被呈现为

代码语言:javascript
复制
<form method="post" id="mysearch" action="/search/?uid=1701">
    <input id="searchterm" type="text" name="query" />
</form>

该表单可以通过jQuery $.POST提交,网址为'/search‘和{ uid: '1701', query: $('#searchterm').val() }的数据,并且工作正常。

如果在输入某项内容后按ENTER键,从而覆盖jQuery提交,则会发生以下情况:

301响应看起来像是Laravel4的响应,显式地添加了:

代码语言:javascript
复制
HTTP/1.0 301 Moved Permanently
Date: Thu, 28 Nov 2013 14:05:29 GMT
Server: Apache
X-Powered-By: PHP/5.4.20
Cache-Control: no-cache
Location: http://development/search?uid=1701
Connection: close
Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="refresh" content="1;url=http://development/search?uid=1701" />
    <title>Redirecting to http://development/search?uid=1701</title>
</head>
<body>
Redirecting to <a href="Redirecting to http://development/search?uid=1701">Redirecting to http://development/search?uid=1701</a>
</body>
</html>

这与这个问题不一样,因为在那里重定向是预期的,它是对不想要的东西的答案。在这里,我(现在)可以看到无缘无故地产生的重定向本身。

我怀疑,出于某种原因,我触发了另一个答案中描述的“安全重定向”,而这不是由jQuery触发的(因为它将所有内容放在文章中,而这里我在URL中有一个参数,而POST中有另一个参数,或者因为jQuery使用XHR)。

我原以为这可能是CSRF的防御,但那条特别的路线没有被屏蔽。作为最后一个资源,我将保护路由并将令牌添加到表单中,即使在我看来它有点像巫毒。在Rails,似乎也发生了类似的事情。

解决办法

我得到的不是一个,不是两个,而是的解决方案,它们巧妙地避开了为什么会发生上述情况的问题:

  • (最残忍)在表单中阻止keyUp事件。
  • 将表单的提交事件重定向到jQuery
  • (最透明的)将上述事件路由到$('#search-button').click()

我想在没有按钮的情况下制作...but (我可以用jQuery来做)和没有jQuery的(完全)。以及了解这里发生了什么。我百分之九十九肯定我错过了一些显而易见的东西。

调试

现在我将对整个框架源代码进行grep -r "Redirecting to" * (我希望在Symfony/Components/HttpFoundation/ResponseRedirect中找到一些东西),并从那里逐步执行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-28 14:52:08

TL;DR

确保POST URL不会以斜杠结尾. --但是Laravel4.1用户首先检查下面的更新。

=======

当它起作用时,它不是迷信--这是科学

一旦我把我的愚蠢公诸于众,我肯定会自己找到那个答案,否则我会躲上好几个小时

我将争辩说,Laravel4的HTML消息可以提供更多的信息。

grep如出一辙地发现了重定向的起源:

代码语言:javascript
复制
grep -r "Redirecting to" *
vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php:        <title>Redirecting to %1$s</title>
vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/RedirectResponse.php:        Redirecting to <a href="%1$s">%1$s</a>.

在这一点上,一个简单的回溯找到了起源,早期的Laravel4派生:

代码语言:javascript
复制
bootstrap/start.php:

...
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/

$app = new Illuminate\Foundation\Application;

$app->redirectIfTrailingSlash();

一看到redirectIfTrailingSlash,我就意识到由表单和jQuery发送的两个URL并不相同。

代码语言:javascript
复制
... action="/search/?uid=1701">   <--- TRAILING SLASH AFTER 'search'

... url:   '/search',             <--- NO TRAILING SLASH
    data:  {
               uid  : 1701,
               query: $('#searchterm').val()
           },
...

为什么会发生这样的事情,我不太在意,但解决办法非常简单:

从POST操作字段中移除斜杠.

(并确保.htaccess没有规则将URL视为“目录”并添加回斜杠--但如果是的话,jQuery也会失败)。

更新

显然,这件事在Laravel 4.1中得到了审查。升级提到

移除重定向尾随斜线 在引导/start.php文件中,删除对$app->redirectIfTrailingSlash()的调用。此方法不再需要,因为此功能现在由框架中包含的.htaccess文件处理。 接下来,用这个处理尾随斜杠的新文件替换您的Apache .htaccess文件。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20268863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档