Параметр 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);
Другие вопросы по тегам