我确信,另一个我没有睡觉的问题.我把它作为牺牲给老上帝墨菲发布:一旦我揭露了我的所有人看到的蠢事,我保证会自己找到答案,否则我将躲过几个小时(通过进一步的忏悔,然后我会发布答案).

我有一个HTML表单,呈现为

<form method="post" id="mysearch" action="/search/?uid=1701">
    <input id="searchterm" type="text" name="query" />
</form>

表单可以通过jQuery $.POST提交,其中url为’/ search’,数据为{uid:’1701′,查询:$(‘#searchterm’).val()}并且可以正常工作.

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

>按预期方式向服务器发出POST.
> Route :: post(‘/ search’,function(){…不会被调用.
>返回301 a Moved Permanently
> a GET with search parameters lost发布到Redirect指定的URL
>很明显,搜索失败了.

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>

这与this question不同,因为预期会有重定向,这是不希望的答案.这是重定向本身,无缘无故地生成(现在).

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

我原以为它可能是一个CSRF防御,但是那个特定的路线没有被屏蔽.作为最后一个资源,我将CSRF保护路由并将令牌添加到表单中,即使它看起来有点像伏都教给我.似乎有些模糊的东西似乎在Rails发生.

解决方法

我没有一个,而不是两个,而是三个解决方案,巧妙地回避了上述问题的原因:

>(最残酷)阻止表单中的keyUp事件.
>将表单的submit事件重定向到jQuery
>(最透明)将上述事件路由到$(‘#search-button’).click()

…但我想完全没有按钮(我可以用jQuery做)并且完全没有jQuery.同时了解这里发生了什么.我99%肯定我错过了一些明显的东西.

调试

我现在要grep -r“重定向到”*整个框架源代码(我期望在Symfony / Components / HttpFoundation / ResponseRedirect中找到一些东西)并从那里一步一步地进行.

TL; DR

确保POST URL不以斜杠结尾. – 但是Laravel 4.1用户首先检查下面的更新.

=======

它工作时,它不是迷信 – 这是科学:-(

as soon as I expose my moronity for all to see,I’m guaranteed to find by myself
that answer that would otherwise elude me for hours

我认为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也会失败).

UPDATE

显然,这个问题在Laravel 4.1中得到了回顾. upgrade提到

Removing Redirect Trailing Slash

In your bootstrap/start.PHP file,remove the call to
$app->redirectIfTrailingSlash(). This method is no longer needed as
this functionality is Now handled by the .htaccess file included with
the framework.

Next,replace your Apache .htaccess file with this new one that handles trailing slashes.

php – Laravel4 POST无法解释的重定向到GET的更多相关文章

  1. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  2. ios – 将iphone应用程序重定向到苹果商店

    我有一个iPhone应用程序,当有可用的升级时,我想提示用户升级,如果他们点击升级,我想将它们重定向到苹果商店.这是怎么做到的?

  3. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  4. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  5. ios – Oauth突然无法使用iphone(仅安装了FS应用程序)

    我们的iPhone应用程序允许通过oauth通过Foursquare登录.它工作正常,最近停止工作.我们得到的错误是:连接失败:回调uri对此使用者无效.但是,如果用户没有在手机上安装foursquare应用程序,它可以像以前一样正常工作.似乎FS现在正在进行重定向来处理FS应用程序内部的oauth,并且在尝试返回到原始应用程序时失败.通过野生动物园它似乎工作.这是在ios9上.解决方案?

  6. ios – 以http无效的自定义URL方案开头

    我在应用程序中使用了自定义URL方案.我成功地从safari重定向到我的应用程序.就像我已经制作了URL方案“appname”.请检查http://prntscr.com/2cjx0p.我需要使用像iosurlredirectfrommailtoapp这样的解决方案,但我不确定如何设置cookie.我发现我必须首先在我的应用程序中为服务器“http://myappname.com”设置一个cook

  7. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  8. ios – NSURLProtocol的抽象方法

    我一直在我的应用程序中使用自定义NSURLProtocol来检测资源并从缓存目录加载(如果可用),或重定向回我的应用程序的服务器.但是,我发现缺少抽象方法的文档,我不知道如何处理我们需要实现的一些抽象方法.我们必须实施:canInitWithRequest很简单,这就是告诉NSURLProtocol您将响应此请求的方式.我不知道如何处理canonicalRequestForRequest:在sta

  9. ios – NSURLRequest:如何处理重定向的帖子?

    没有收到连接响应.处理重定向的相关iOS方法是,根据Apple的文档,如果代理没有实现连接:willSendRequest:redirectResponse:,所有规范更改和服务器重定向都是允许的.那么这不是我的经验,因为离开这个方法不适合我.该请求只是挂起没有响应.苹果还建议执行willSendRequest,这对我来说不起作用.我看到了调用,但结果的请求只是挂起.我当前执行的willSendRequest如下(见下文).这遵循重定向,但是处理请求就像是GET,而不是POST.我相信问题是重定向失去了H

  10. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

随机推荐

  1. php – 用户身份验证不会在Laravel包中持久存在

    谢谢事实证明问题在于新的Web中间件,将我需要会话数据的所有路由移动到路由组中,一切正常.

  2. php – 找不到laravel类(适用于localhost但不适用于DO服务器)

    这是一个重复的问题–例如:Laravel4migrations–classnotfound但是,我已经尝试了所有解决方案并且无法解决这个问题.脚本我在我的本地机器上创建了一个Laravel4项目–添加了一些类,控制器,视图等–项目运行良好.然后我将这个新的repo复制到我的DO服务器上–用composer等安装依赖项.该项目看起来不错,除了一个页面发出错误:您可以查看此页面here.我试过了…

  3. php – Laravel SSH服务器未存储在配置文件中

    我有一个涉及服务器管理的项目,我需要执行一些SSH命令.在Laravel我有SSH实用程序(远程),但我必须将配置放在一个文件中.我需要从数据库中连接存储在模型中的凭据.任何想法我怎么能这样做?

  4. php – 如何通过Axios将文件发送到Laravel

    我需要通过Axios将文件从客户端发布到服务器.这是我的Vuejs代码:这是我用于处理已发送文件的Laravel代码:但它始终返回否它不是文件.任何帮助将非常感激.您必须创建一个FormData对象并附加图像文件.一个例子是here.如果有效,请告诉我.

  5. php – Laravel API TokenMismatchException

    我有一个带有帖子数据的API调用;让我们说这是登录过程.使用Chrome的Postman扩展程序,我通过POST发送用户名和密码以登录用户.但是我得到了这样的信息:在我的基本控制器中,我有:当我用beforeFilter删除行时,一切正常.但这不是一个解决方案.任何POST调用都会收到此错误消息.我知道我需要这个_token.但是当我从API调用时,我如何获得此令牌?我知道我可以在Laravel中创建一个令牌,但是当我通过API从外部打电话时我怎么能这样做呢?

  6. php – Laravel重定向到一个路由,但随后apache给出了404错误

    这是我的最终(和工作)vhost配置:

  7. php – Laravel Collection键修改

    我使用Collection类中的filter方法从集合中删除一些对象.但在那次操作之后,有时会出现带钥匙的物体,例剩下1,4,5.我希望在过滤操作后总是有0,1,2,3等顺序的元素.有没有任何优雅的方法来做到这一点,而无需将表重写为新表?您可以使用LaravelCollection的values()方法以序列化顺序生成集合的键,如下所示:希望这可以帮助!

  8. php – Laravel 5,如何测试是否在控制器中选中了Checkbox

    如果选中复选框,我试图获取:在我看来:在我的控制器中:在web.PHP中:但不起作用.我该怎么办?谢谢你的答复.编辑1:这是我的形式很差的建设我相信你真正的问题是你有两种不同的形式.您的复选框采用一种形式,您的提交按钮采用第二种形式.我相信它们都需要采用相同的形式.否则,永远不会返回您的复选框状态,无论其状态如何.在您的视图中,尝试替换您提供的表单标记:

  9. php – Laravel 5 – 根据需要验证数组,但允许传递一个空数组

    我正在使用验证器验证Laravel5.4中的请求,请参阅文档:https://laravel.com/docs/5.4/validation#validating-arrays基本上,这是Controller中的代码:我想要求字段“items”的存在,并且这个代码可以实现,但问题是当“items”字段是空数组时验证失败,即,这是一种不受欢迎的行为.我知道这是“必需”参数的记录行为,但我没有看到任何

  10. php – Laravel扩展Form类

    我正在尝试扩展L4.1中的Form类,但我似乎错过了一些东西.我的文件基于API命名为FormBuilder.PHP,保存在app/libraries/extended/FormBuilder.PHP中.这实际上是我第一次尝试在Laravel中扩展核心类.我似乎无法指出如何正确扩展像这个Form类的核心类.编辑:我将“app/libraries/extended”添加到我的composer.jso

返回
顶部