另一个我没睡够的问题,我敢肯定。我把它作为一种牺牲,作为对大神墨菲的一种牺牲:一旦我把我的愚蠢暴露给所有人看,我肯定会自己找到答案,否则我会躲过几个小时(为了进一步的忏悔,我也会贴出答案)。
我有一个HTML表单,它被呈现为
<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提交,则会发生以下情况:
Route::post('/search', function() {...不调用而不是。301响应看起来像是Laravel4的响应,显式地添加了:
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事件。$('#search-button').click()我想在没有按钮的情况下制作...but (我可以用jQuery来做)和没有jQuery的(完全)。以及了解这里发生了什么。我百分之九十九肯定我错过了一些显而易见的东西。
调试
现在我将对整个框架源代码进行grep -r "Redirecting to" * (我希望在Symfony/Components/HttpFoundation/ResponseRedirect中找到一些东西),并从那里逐步执行。
发布于 2013-11-28 14:52:08
TL;DR
确保POST URL不会以斜杠结尾. --但是Laravel4.1用户首先检查下面的更新。
=======
当它起作用时,它不是迷信--这是科学
一旦我把我的愚蠢公诸于众,我肯定会自己找到那个答案,否则我会躲上好几个小时
我将争辩说,Laravel4的HTML消息可以提供更多的信息。
grep如出一辙地发现了重定向的起源:
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派生:
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并不相同。
... 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文件。
https://stackoverflow.com/questions/20268863
复制相似问题