Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.06.2016 03:14:23

Слеш в конце URL

Добрый день.

Как сделать URL вида не "site.ru/test", а "site.ru/test/"?
Возник вопрос, не могу нагуглить. Смотрите. Например, я хочу создать страницу /test.html, я пишу роут:

Route::get('/test/.html', function () {});

Всё работает и всё отлично. Но если я хочу закончить не .html, а слешем, то у меня происходит переадресация с адреса со слешем на адрес без слеша и вот такая запись ни на что не влияет:

Route::get('/test/', function () {});

При этом непонятно отдельно, как быть с роутами вида, где слеш означает не окончание строки, а как бы индексный файл:

Route::get('/', function () {});

Что делать? Как сделать URL вида не "site.ru/test", а "site.ru/test/"?

Изменено aanon (17.06.2016 03:21:00)

Не в сети

#2 17.06.2016 08:45:17

Re: Слеш в конце URL

Никто не сталкивался?..

Не в сети

#3 17.06.2016 10:10:54

Re: Слеш в конце URL

Ну так это стало быть Апач делает rewrite. Значит надо задать новое правило для твоей страницы, чтобы он воспринимал этот слэш.

Не в сети

#4 17.06.2016 10:53:30

Re: Слеш в конце URL

Stokke пишет:

Ну так это стало быть Апач делает rewrite. Значит надо задать новое правило для твоей страницы, чтобы он воспринимал этот слэш.

Я не совсем об этом. Дело не только в роутах. Например, я настроил nginx так, что он обрабатывает адреса и со слешем и без слеша и редиректа не происходит. Но когда я создаю URL:

Route:

Route::get('/test/', ['as' => 'test'], function () {
    return "test";
});

View:

<p> {{ url('test') }} </p>

То я получаю URL вида:

site.ru/test

вместо

site.ru/test

Чтобы было совсем понятно. Например, в Yii2 можно задать suffix для урлов в настройках роутера. И тогда все урлы автоматически получат этот суффикс в конце. И указываю в роуте "test" на деле будет URL вида "test.html".

Updated:

И нет, если сделать:

{{ url('test/') }}

То это ничего не меняет (насколько я понимаю - это альяс в данном контексте, а не конкретный URL).

Изменено aanon (17.06.2016 11:02:54)

Не в сети

#5 17.06.2016 10:54:24

Re: Слеш в конце URL

апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
я лично давно на nginx сижу.

Не в сети

#6 17.06.2016 11:03:34

Re: Слеш в конце URL

hzone пишет:

апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
я лично давно на nginx сижу.

Без проблем. А сделать-то как то, что я хочу? Я выше описал ситуацию с nginx.

Изменено aanon (17.06.2016 11:04:02)

Не в сети

#7 17.06.2016 12:57:33

Re: Слеш в конце URL

ключевые слова для гугла:
laravel 5 trailing slash route

Не в сети

#8 17.06.2016 18:34:03

Re: Слеш в конце URL

Ок, можно попробовать отредактировать вот этот файл: https://github.com/laravel/framework/bl … #L493-L504

Плохо то, что он в vendor'е, нужно придумать грамотный костыль, чтобы как-то переопределить метод.

Не в сети

#9 18.06.2016 01:06:54

Re: Слеш в конце URL

не факт что нужно костыли, даже не факт, что нужно что-то делать ;-)

Не в сети

#10 18.06.2016 16:53:20

Re: Слеш в конце URL

hzone пишет:

не факт что нужно костыли, даже не факт, что нужно что-то делать ;-)

Вы или знаете и скажите или не знаете и не надо напускать загадочность smile)

Не в сети

#11 18.06.2016 18:52:39

Re: Слеш в конце URL

я просто не хожу против потока реки.

Не в сети

#12 18.06.2016 19:38:34

Re: Слеш в конце URL

  1. апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.

С какой радости Apache редиректит URL c / на URL без /? Обратное — да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.

aanon, надо смотреть лог запроса. В Firefox открыть private tab, открыть Firebug или обычные developer tools (ctrl+shift+i), дальше вставить URL со слэшем и смотреть вывод, потом убрать весь код Laravel из public и сравнить. Если редирект от сервера, то он будет в обоих случаях (уверен, что дело не в нём).

Private Mode нужен для отключения кэширования редиректов, которое Firefox делает для 301.

Не в сети

#13 18.06.2016 20:15:33

Re: Слеш в конце URL

Proger_XP пишет:

}%> апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
С какой радости Apache редиректит URL c / на URL без /? Обратное - да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.

а я и не говорил о на правлении с / на без / smile
и сказал я именно об обратном направлении, ибо так и поняял автора wink

Не в сети

#14 18.06.2016 20:18:05

Re: Слеш в конце URL

  1. и сказал я именно об обратном направлении, ибо так и поняял автора ;)

Автор всё ясно написал, что и как, а ты вместо конкретных советов начал темнить. Ещё и не по делу, как оказалось.

Не в сети

#15 19.06.2016 15:36:03

Re: Слеш в конце URL

Proger_XP пишет:

С какой радости Apache редиректит URL c / на URL без /? Обратное - да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.

aanon, надо смотреть лог запроса. В Firefox открыть private tab, открыть Firebug или обычные developer tools (ctrl+shift+i), дальше вставить URL со слэшем и смотреть вывод, потом убрать весь код Laravel из public и сравнить. Если редирект от сервера, то он будет в обоих случаях (уверен, что дело не в нём).

Private Mode нужен для отключения кэширования редиректов, которое Firefox делает для 301.

Благодарю, уважаемый. Я уж было подумал, что тут даже темы не читают.

Я вот тут подробнее отписал: https://laravel.ru/forum/viewtopic.php?pid=7754#p7754

Дело вовсе не в редиректах от веб-сервера. Nginx по умолчению позволяет открыть и адрес /test и адрес /test/. Апач можно настроить (вернее - отключить редирект с /test/ на /test в .htaccess) и заработают оба адреса.

Вопрос не в том, что делать с веб-сервером, с ним ничего делать не надо. Updated: Не надо ничего делать потому, что если прописать это на уровне веб-сервера, то все адреса без слеша получат редирект на адреса со слешем. Поисковик сойдет с ума - весь сайт состоит из редиректов О_о

Вопрос в том, как в Laravel по умолчанию правильно задать поведение: "генерировать URL'ы со слешем на конце" и возможно ли это вообще. Я с ним работаю всего неделю и информацию найти не смог.

Смог найти только что-то в духе "нууу, вы можете взять и переписать куски фреймворка как вам надо", но это решение не очень хорошее, мягко говоря.

Может быть вы мне подскажете немного другое: вот есть файл в вендоре (/src/Illuminate/Routing/UrlGenerator.php), я хочу его заменить своим. Очевидно, что нельзя менять его в вендоре, ведь при следующем composer update мои изменения будут затерты (я уже молчу о том, что в git'е вендор не лежит вообще). Как правильно мне изменить его?

Изменено aanon (19.06.2016 15:42:43)

Не в сети

#16 19.06.2016 23:49:49

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Слеш в конце URL

Если вам нужно именно генерация ссылок со слешем — самое простое написать свой хелпер

PHP
function trailingSlashUrl($url) {
  return 
url($url).'/';
}

Использовать по необходимости вместо хелпера url(). Аналогично с хелпером action().
В Nginx ессно должно быть прописано что-то вроде rewrite ^(.*[^/])$ $1/ permanent;

  1. Вопрос не в том, что делать с веб-сервером, с ним ничего делать не надо. Updated: Не надо ничего делать потому, что если прописать это на уровне веб-сервера, то все адреса без слеша получат редирект на адреса со слешем. Поисковик сойдет с ума — весь сайт состоит из редиректов О_о

Именно чтобы не было путаницы, в ларавел все адреса без слешей. И я вам советую не заморачиваться со слешами и псевдостатикой, сейчас не 2008 год)

Не в сети

#17 20.06.2016 00:20:40

Re: Слеш в конце URL

  1. Именно чтобы не было путаницы, в ларавел все адреса без слешей. И я вам советую не заморачиваться со слешами и псевдостатикой, сейчас не 2008 год)

Я тоже поддерживаю этот вариант, просто потому, что со слэшами есть большой риск где-то напутать и часть ссылок будет с ними, часть без. Отключать редирект на слэш у Apache/nginx, если это папка на диске, смысла не вижу, т.к. здесь путаницы не будет (статика обрабатывается только ими). А генерировать ссылки для обработки скриптами лучше без URL.

Если делать, то, как сказали выше — отдельную функцию для добавления / и далее либо правило в .htaccess/nginx для перенаправления для отдельных URL без слэша на слэш, либо подкручивание внутренностей фреймворка. В первом случае надо будет не забывать обновлять конфиг сервера при изменении списка путей со слэшами, во втором — не забыть заново накатить патч при обновлении.

А в чём смысл этой затеи?

Не в сети

#18 20.06.2016 05:15:32

Re: Слеш в конце URL

Proger_XP пишет:

А в чём смысл этой затеи?

Да просто есть один сайт, где страницы уже со слешем. Я хочу перевести его на фреймворк. Но я не хочу делать километровый список редиректов или (не дай бог вообще!) переиндексацию в поисковых системах. Для них-то это разные адреса.

А как мне правильно написать свою функцию url()? UPD: Вернее, куда положить ее?

Изменено aanon (20.06.2016 05:16:12)

Не в сети

#19 20.06.2016 09:12:07

Re: Слеш в конце URL

aanon пишет:

А как мне правильно написать свою функцию url()? UPD: Вернее, куда положить ее?

The Laravel Way - создать helpers.php в нем разместить свою функцию-помощника (helper), например slash_url() или перезаписать существующую функцию url().

1. Файл helpers.php кладешь в папку App\Support\helpers.php, например.

2. Добавляешь этот код в секцию autoload файла composer.json:

    "autoload": {
        "classmap": [
            ....
        ],
        "psr-4": {
            ....
        },
        "files": [
            "app/Support/helpers.php"
        ]
    },

3. Если не работает, запусти команду composer dumpauto.

В итоге у тебя появится глобальная функция-помощник, с которой ты можешь работать также, как с "родными".

Пример функции:

    function slash_url($path)
    {
        $url = app(UrlGenerator::class)->to($path);

        return $url.'/';
    }

Не в сети

#20 20.06.2016 09:31:32

Re: Слеш в конце URL

AlexeyMezenin пишет:

The Laravel Way - создать helpers.php в нем разместить свою функцию-помощника (helper)

Спасибо! Думаю, тему можно закрывать на этом smile

Не в сети

Подвал раздела