我第一次使用Laravel 5.1,我无法理解为什么我在ajax调用上获取404s,该调用将URL作为参数传递给服务器PHP脚本。
我正在执行一个由路由处理的Ajax调用,如下所示:
Route::get('ajax/{act}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers']);
我希望变量{act}
能够保存我传递的键/值对的sring。我在服务器端的PHP中解码这些。 Ajax PHP脚本包含各种帮助程序,我不想为每个帮助程序创建一个Laravel程序。
在我的应用中,用户将在表单字段中输入一个网址,我在一个名为website
我的ajax电话需要接受:
var url = '/ajax/act=url&u=' + website;
我这样做是为了构建url然后传递给jQuery $.getJSON
调用:
var url = '/ajax/act=url&&u=' + encodeURIComponent(website);
我希望encodeURIcompponent()
函数可以使其工作,但当404
之前的任何参数包含/
个字符时,它会返回encodeURIComponent()
。我的基本网址完美无需额外的网址作为参数。
但是将url作为变量值传递,它会抛出404。
这是ajax调用中的url看起来像404返回的内容:
http://my.app/ajax/act=url&u=http%3A%2F%2Fgoogle.com
此网址完美无缺(我已从//
http://google.com
http://my.app/ajax/act=url&u=http%3Agoogle.com
当变量url中有其他路径项时,它也会失败,因为它包含其他/
个字符,如下所示:
http://google.com/subfolder
如何在ajax调用中将完整的url作为参数传递?谢谢!
答案 0 :(得分:3)
我认为你混淆了路由参数和查询参数。您的路线定义为ajax/{action}
。在这种情况下,{action}
是一个路由参数,但您正在尝试将查询参数填充到其中。
例如,如果您访问网址http://my.app/ajax/act=url&u=google.com
,这将有效,因为您已经点击了ajax/{action}
,其中{action}
是act=url&u=google.com
。这是将传递给AjaxController@helpers
函数的值。但是,由于此数据作为路由参数传递,因此它不在请求输入中。 $request->all()
将为空。
但是,如果您访问网址http://my.app/ajax/act=url&u=http://google.com
,则无法使用,因为您没有定义此路由。这不会映射到ajax/{action}
路由;此路由将映射到ajax/{action}//google.com
,您尚未定义(因此404)。
我认为你真正想要的是:http://my.app/ajax/url?u=http%3A%2F%2Fgoogle.com
。这将使您的ajax/{action}
路由以url
作为{action}
路由参数,并且网址值将位于查询参数中。在AjaxController@helpers
功能中,您可以通过$request->input('u');
访问网址。
如果你真的需要这些数据作为路由参数进入,另外一个选项是你必须确保你的路由参数消耗所有东西,包括斜杠:
Route::get('ajax/{action}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers'])
->where('action', '.*');
但是,如果您这样做,此路线将捕获http://my.app/ajax/...
下的所有内容。
答案 1 :(得分:0)
您正在将相对路径与您的网址变量一起使用(因为您的网址中有一个领先/
),这可能导致找不到404
错误。
尝试使用Laravel帮助方法base url
将url()
存储在视图中的隐藏字段中(如果需要,可以在主视图中执行此操作)。
<input id='baseUrl' type='hidden' value='{{ url() }}' />
您可以像创建JS帮助函数一样简单地获取值:
var baseUrl = function(){
return $('#baseUrl').val();
};
然后将该url追加到变量url
的开头,如下所示:
var url = baseUrl() + '/ajax/act=url&&u=' + encodeURIComponent(website);