Laravel 5.1 ajax url 参数为 url

Laravel 5.1 ajax url parameter is url

我是第一次使用 Laravel 5.1,我不明白为什么我在将 URL 传递给服务器 PHP 的 ajax 调用中收到 404 ] 脚本作为参数。

我正在执行一个 Ajax 调用,该调用由如下路由处理:

Route::get('ajax/{act}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers']);

我希望变量 {act} 保存我传递的键/值对的字符串。我在服务器端的 PHP 中解码这些。 Ajax PHP 脚本包含各种助手,我不想为每个助手创建一个 Laravel 路由。

在我的应用程序中,用户将在表单字段中输入 url,我将其捕获到名为 website

的变量中

我的 ajax 呼叫需要接受:

var url = '/ajax/act=url&u=' + website;

我这样做是为了构建 url 然后传递给 jQuery $.getJSON 调用:

var url = '/ajax/act=url&&u=' + encodeURIComponent(website);

我希望 encodeURIcompponent() 函数能够完成这项工作,但是当任何参数在 [=26] 之前包含 / 个字符时,它 returns 404 =].我的基础 url 在没有额外的 url 作为参数的情况下工作得很好。

但是将 url 作为变量值传递时,它会抛出 404。

这就是 ajax 调用中的 url 的样子 returns 404:

http://my.app/ajax/act=url&u=http%3A%2F%2Fgoogle.com

此 url 完美运行(我已从 http://google.com:

中删除 //
http://my.app/ajax/act=url&u=http%3Agoogle.com

当变量 url 中有额外的路径项时它也会失败,因为它包含额外的 / 个字符,如下所示:

http://google.com/subfolder

如何在 ajax 调用中将完整的 url 作为参数传递?谢谢!

您正在使用 relative 路径和您的 url 变量(因为您在 URL 中有前导 /),即可能导致 404 未找到错误。

尝试使用 Laravel 的辅助方法 url()base url 存储在视图的隐藏字段中(您可以在 master 如果需要,请查看)。

<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);

我认为您混淆了路由参数和查询参数。您的路线定义为 ajax/{action}。在这种情况下,{action} 是一个路由参数,但您正试图将查询参数塞入其中。

例如,如果您访问 url http://my.app/ajax/act=url&u=google.com,这将起作用,因为您已经到达路线 ajax/{action},其中 {action}act=url&u=google.com.这是将传递给您的 AjaxController@helpers 函数的值。但是,由于此数据作为路由参数传入,因此不在请求输入中。 $request->all() 将为空。

但是,如果您访问 url 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。这将使用 url 作为 {action} 路由参数命中您的 ajax/{action} 路由,并且 url 值将在查询参数中。在您的 AjaxController@helpers 函数中,您可以通过 $request->input('u');.

访问 url

编辑

如果您确实需要将此数据作为路由参数传入,则您必须确保路由参数使用所有内容,包括斜杠:

Route::get('ajax/{action}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers'])
    ->where('action', '.*');

但是,如果您这样做,这条路线将捕获属于 http://my.app/ajax/....

的所有内容