Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день.
Как сделать 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)
Не в сети
Никто не сталкивался?..
Не в сети
Ну так это стало быть Апач делает rewrite. Значит надо задать новое правило для твоей страницы, чтобы он воспринимал этот слэш.
Не в сети
Ну так это стало быть Апач делает 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)
Не в сети
апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
я лично давно на nginx сижу.
Не в сети
апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
я лично давно на nginx сижу.
Без проблем. А сделать-то как то, что я хочу? Я выше описал ситуацию с nginx.
Изменено aanon (17.06.2016 11:04:02)
Не в сети
ключевые слова для гугла:
laravel 5 trailing slash route
Не в сети
Ок, можно попробовать отредактировать вот этот файл: https://github.com/laravel/framework/bl … #L493-L504
Плохо то, что он в vendor'е, нужно придумать грамотный костыль, чтобы как-то переопределить метод.
Не в сети
не факт что нужно костыли, даже не факт, что нужно что-то делать ;-)
Не в сети
не факт что нужно костыли, даже не факт, что нужно что-то делать ;-)
Вы или знаете и скажите или не знаете и не надо напускать загадочность )
Не в сети
я просто не хожу против потока реки.
Не в сети
- апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
С какой радости Apache редиректит URL c / на URL без /? Обратное — да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.
aanon, надо смотреть лог запроса. В Firefox открыть private tab, открыть Firebug или обычные developer tools (ctrl+shift+i), дальше вставить URL со слэшем и смотреть вывод, потом убрать весь код Laravel из public и сравнить. Если редирект от сервера, то он будет в обоих случаях (уверен, что дело не в нём).
Private Mode нужен для отключения кэширования редиректов, которое Firefox делает для 301.
Не в сети
}%> апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
С какой радости Apache редиректит URL c / на URL без /? Обратное - да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.
а я и не говорил о на правлении с / на без /
и сказал я именно об обратном направлении, ибо так и поняял автора
Не в сети
Не в сети
С какой радости 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)
Не в сети
Если вам нужно именно генерация ссылок со слешем — самое простое написать свой хелпер
function trailingSlashUrl($url) {
return url($url).'/';
}
Использовать по необходимости вместо хелпера url(). Аналогично с хелпером action().
В Nginx ессно должно быть прописано что-то вроде rewrite ^(.*[^/])$ $1/ permanent;
- Вопрос не в том, что делать с веб-сервером, с ним ничего делать не надо. Updated: Не надо ничего делать потому, что если прописать это на уровне веб-сервера, то все адреса без слеша получат редирект на адреса со слешем. Поисковик сойдет с ума — весь сайт состоит из редиректов
Именно чтобы не было путаницы, в ларавел все адреса без слешей. И я вам советую не заморачиваться со слешами и псевдостатикой, сейчас не 2008 год)
Не в сети
- Именно чтобы не было путаницы, в ларавел все адреса без слешей. И я вам советую не заморачиваться со слешами и псевдостатикой, сейчас не 2008 год)
Я тоже поддерживаю этот вариант, просто потому, что со слэшами есть большой риск где-то напутать и часть ссылок будет с ними, часть без. Отключать редирект на слэш у Apache/nginx, если это папка на диске, смысла не вижу, т.к. здесь путаницы не будет (статика обрабатывается только ими). А генерировать ссылки для обработки скриптами лучше без URL.
Если делать, то, как сказали выше — отдельную функцию для добавления / и далее либо правило в .htaccess/nginx для перенаправления для отдельных URL без слэша на слэш, либо подкручивание внутренностей фреймворка. В первом случае надо будет не забывать обновлять конфиг сервера при изменении списка путей со слэшами, во втором — не забыть заново накатить патч при обновлении.
Не в сети
А в чём смысл этой затеи?
Да просто есть один сайт, где страницы уже со слешем. Я хочу перевести его на фреймворк. Но я не хочу делать километровый список редиректов или (не дай бог вообще!) переиндексацию в поисковых системах. Для них-то это разные адреса.
А как мне правильно написать свою функцию url()? UPD: Вернее, куда положить ее?
Изменено aanon (20.06.2016 05:16:12)
Не в сети
А как мне правильно написать свою функцию 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.'/';
}
Не в сети
The Laravel Way - создать helpers.php в нем разместить свою функцию-помощника (helper)
Спасибо! Думаю, тему можно закрывать на этом
Не в сети
Страницы 1