Параметр URL Ajax Laravel 5.1 - это URL
Я работаю с Laravel 5.1 впервые и не могу понять, почему я получаю 404 с при вызове ajax, который передает URL-адрес серверному PHP-скрипту в качестве параметра.
Я выполняю вызов Ajax, который обрабатывается маршрутом следующим образом:
Route::get('ajax/{act}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers']);
Я хочу переменную {act}
чтобы держать строку пар ключ / значение, которые я передаю. Я декодирую их в PHP на стороне сервера. PHP-скрипт Ajax содержит множество помощников, и я не хочу создавать для каждого из них маршрут Laravel.
В моем приложении пользователь вводит URL-адрес в поле формы, которое я записываю в переменную с именем website
Мой вызов ajax должен принять:
var url = '/ajax/act=url&u=' + website;
Я делаю это, чтобы построить URL-адрес, который я затем передам jQuery $.getJSON
вызов:
var url = '/ajax/act=url&&u=' + encodeURIComponent(website);
Я бы ожидал encodeURIcompponent()
функция, чтобы сделать эту работу, но она возвращает 404
когда любой из параметров содержит /
символы до encodeURIComponent()
, Мой базовый URL работает отлично без дополнительного URL в качестве параметра.
Но передавая URL-адрес как значение переменной, он выдает 404.
Вот как выглядит URL в вызове ajax, который возвращает 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
Как передать полный URL-адрес в качестве параметра в вызове ajax? Спасибо!
2 ответа
Я думаю, что вы путаете параметры маршрута и параметры запроса. Ваш маршрут определяется как 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
, Это ударит ваш ajax/{action}
маршрут с url
как {action}
Параметр маршрута и значение URL будут в параметрах запроса. Внутри вашего AjaxController@helpers
функция, вы можете получить доступ к URL через $request->input('u');
,
редактировать
Если вам действительно нужны эти данные, чтобы войти в качестве параметра маршрута, вы должны убедиться, что ваш параметр маршрута использует все, включая косые черты:
Route::get('ajax/{action}', ['uses' => 'AjaxController@helpers', 'as' => 'ajax.helpers'])
->where('action', '.*');
Если вы сделаете это, однако, этот маршрут будет ловить все, что подпадает под http://my.app/ajax/...
,
Вы используете относительные пути с вашей переменной URL (как вы ведущий /
в вашем URL), что может быть причиной 404
не найдена ошибка.
Попробуйте сохранить ваш base url
используя вспомогательный метод Laravel 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);