непавильный адрес картинки из-за чпу
Здравствуйте, у меня такой вопрос: в общем на сайте у меня включено ЧПУ и есть TV поле с картинкой. Но сама картинка не отображается на сайте, так как из-за чпу к её адресу приписывается ещё и адрес категории. То есть вот как это всё выглядит:
site.com/category/images/img.jpg
А должно быть так:
site.com/images/img.jpg
Скажите, как можно решить эту задачу?
site.com/category/images/img.jpg
А должно быть так:
site.com/images/img.jpg
Скажите, как можно решить эту задачу?
Комментарии: 13
Дело не в чпу, а в том как вы выводите ссылку. Попробуйте перед адресом картинки поставить /
Спасибо за ответ! Я уже это сделал и всё заработало. Только вот непонятно почему нужно делать именно так? Почему значок / стирает ненужную часть из URL? То есть если бы не было включено ЧПУ со вложенными URL то всё и так бы нормально работало.
Странно, добавил в шаблоне перед [[*img]] знак / и картинка заработало, то есть теперь код выглядит так:
Кто нибудь может что нибудь сказать по этому поводу? Правильное ли это решение, или нужно делать по другому?
Кто нибудь может что нибудь сказать по этому поводу? Правильное ли это решение, или нужно делать по другому?
попробуйте в теге header добавить тег
<base href="http://site.com/">
Нееет, не делайте этого, лучше формируйте URL правильно, как подсказали выше.
Устанавливая тег base вы сломаете якорную навигацию если она есть. Это большая загадка, по какому недоразумению эта штука присутствует (или сейчас нет уже, не уверен) в дефолтном шаблоне modx сразу после установки. И даже видел абсурдные разговоры о том, что это «особенность движка» от лиц, которые не очень понимаю видимо как работает HTML в браузере… короче если вы точно не знаете нужен ли вам тег base (а 99.5% что не нужен) — не используйте его!
Вы хотели подробностей, так вот:
Вообще, контролировать наличие начального слеша можно несколькими способами (и к стати если запутаться, можно наткнуться на ошибку с // двумя начальными слэшами так что я например предпочитаю в верстке его добавлять именно так как и подсказал @Роман ) так как пути строятся из частей, каждой из которых в MODX можно управлять (а можно оставить по дефолту и всё тоже будет ок)
На самом деле к любому ресурсу на сайте есть 2 пути, и оба необходимы:
1) где на жестком диске на сервере лежит файл
2) по какому uri его можно получить из интернета
У вас «проблема» (которая на самом деле особенность построения любого относильеного uri в браузерах, подробности на MDN) с путём 2.
Есть параметр baseUrl в настройках источника файлов (а он в свою очередь указан в вашей TV с картинкой) — можно в его значении поставить в начале этот слэш и тогда не придется его дописывать в верстке.
Только не путайте с basePath — это путь до картинки на сервере (путь 1)
Например картинки лежат на сервере в папке /home/user/data/www/site.ru/assets/img/ тогда в настройках Медиа -> Источники файлов -> Картинки будут такими:
1) basePath = assets/img/
2) baseUrl = /assets/img/
Но как здесь видно,
А первая часть пути до папки задается ещё раньше в файле конфига сайта /core/config/config.inc.php
Устанавливая тег base вы сломаете якорную навигацию если она есть. Это большая загадка, по какому недоразумению эта штука присутствует (или сейчас нет уже, не уверен) в дефолтном шаблоне modx сразу после установки. И даже видел абсурдные разговоры о том, что это «особенность движка» от лиц, которые не очень понимаю видимо как работает HTML в браузере… короче если вы точно не знаете нужен ли вам тег base (а 99.5% что не нужен) — не используйте его!
Вы хотели подробностей, так вот:
Вообще, контролировать наличие начального слеша можно несколькими способами (и к стати если запутаться, можно наткнуться на ошибку с // двумя начальными слэшами так что я например предпочитаю в верстке его добавлять именно так как и подсказал @Роман ) так как пути строятся из частей, каждой из которых в MODX можно управлять (а можно оставить по дефолту и всё тоже будет ок)
На самом деле к любому ресурсу на сайте есть 2 пути, и оба необходимы:
1) где на жестком диске на сервере лежит файл
2) по какому uri его можно получить из интернета
У вас «проблема» (которая на самом деле особенность построения любого относильеного uri в браузерах, подробности на MDN) с путём 2.
Есть параметр baseUrl в настройках источника файлов (а он в свою очередь указан в вашей TV с картинкой) — можно в его значении поставить в начале этот слэш и тогда не придется его дописывать в верстке.
Только не путайте с basePath — это путь до картинки на сервере (путь 1)
Например картинки лежат на сервере в папке /home/user/data/www/site.ru/assets/img/ тогда в настройках Медиа -> Источники файлов -> Картинки будут такими:
1) basePath = assets/img/
2) baseUrl = /assets/img/
Но как здесь видно,
А первая часть пути до папки задается ещё раньше в файле конфига сайта /core/config/config.inc.php
....
if (!defined('MODX_BASE_PATH')) {
$modx_base_path= '/home/user/data/www/modx.pro/';
$modx_base_url= '/';
define('MODX_BASE_PATH', $modx_base_path);
define('MODX_BASE_URL', $modx_base_url);
}
....
Если всё ещё не понятно, формулируйте вопросы, дожмём тему))
Поясните пожалуйста, почему тег base href ломает переход по якорю?
Я использую данный тег на всех проектах, не только modx и он прекрасен.
Не вижу никаких минусов и переходы по якорным ссылкам работают.
Я использую данный тег на всех проектах, не только modx и он прекрасен.
Не вижу никаких минусов и переходы по якорным ссылкам работают.
Потому что тег base переопределяет базовый url для работы всех ссылок в документе. Чтобы не повторять то, что уже написано, оставлю вот эту поясняющую ссылку на stackoverflow и предположу, что и у вас якорная навигация работает на JS, но чтобы сделать хорошо работающую якорную навигацию на JS (так чтобы и по прямым ссылкам работал скролл к нужной зоне, а не только по клику на якорь когда страница уже загружена) нужно приложить ряд дополнительных усилий (например парсить адресную строку), хотя всего этого можно избежать, не используя тег base для решения задач, которые вполне можно решить без него, не обрекая себя на «побочные эффекты» от его применения.
Нет, у меня вполне работают и стандартные якорные ссылки. Иногда, если нужна особая плавность перехода, могу сделать и на javascript.
Та проблема которая описана на stackoverflow решается элементарно, нужно просто в якорной ссылке указывать не #id, а site.com#id
Но даже если у использование base href и создаст какие то проблемы у кого-то, то мне кажется это еще не причина так негативно отзываться о таком замечательном теге, решающим куда больше проблем чем создающим)
Та проблема которая описана на stackoverflow решается элементарно, нужно просто в якорной ссылке указывать не #id, а site.com#id
Но даже если у использование base href и создаст какие то проблемы у кого-то, то мне кажется это еще не причина так негативно отзываться о таком замечательном теге, решающим куда больше проблем чем создающим)
То есть вы предлагаете каждый раз указывая якорную ссылку заботиться о том, чтобы она была указана не относительной, а абсолютной?
Такой подход работает надежно ровно до той поры, пока контент-менеджеру (или прямо вам, но в спешке, когда «оперативка в голове занята») использовать якорную ссылку в поле content или другом, где у вас подключен HTML-редактор.
В плюс к этому, указанные вами ссылки всё равно не будут работать на тестовом домене (не все их используют, ну ок, тогда читайте как «при переезде сайта на другой домен», что тоже редкость, но блин, это побочный эффект, которого бы не было).
Это всё можно победить, конечно, если держать это в голове или описать в документации проекта (ага :) ) но я предлагаю, советую и рекомендую вместо того чтобы «стрелять себе в ногу» тегом base и потом лечить последствия, просто не заниматься самострелом, если позволите.
Такой подход работает надежно ровно до той поры, пока контент-менеджеру (или прямо вам, но в спешке, когда «оперативка в голове занята») использовать якорную ссылку в поле content или другом, где у вас подключен HTML-редактор.
В плюс к этому, указанные вами ссылки всё равно не будут работать на тестовом домене (не все их используют, ну ок, тогда читайте как «при переезде сайта на другой домен», что тоже редкость, но блин, это побочный эффект, которого бы не было).
Это всё можно победить, конечно, если держать это в голове или описать в документации проекта (ага :) ) но я предлагаю, советую и рекомендую вместо того чтобы «стрелять себе в ногу» тегом base и потом лечить последствия, просто не заниматься самострелом, если позволите.
Дмитрий, а подскажите как вы например подключаете файлы стилей или скриптов на страницу?
Указав base href = site.com/ Можно на любой странице подключить скрипт используя относительный путь относительно base href.
А как поступаете вы? Для каждого скрипта указываете абсолютный путь?
Указав base href = site.com/ Можно на любой странице подключить скрипт используя относительный путь относительно base href.
<script src="assets/js/bundle.js">
и на любой странице он будет подключен, вне зависимости от urlА как поступаете вы? Для каждого скрипта указываете абсолютный путь?
Конечно, для каждого скрипта указываю абсолютный путь, ведь это всего лишь вместо
<script src="assets/js/bundle.js">
будет<script src="/assets/js/bundle.js">
зато я точно знаю, что заберу скрипт от корня, а в вашем случае потенциально возможны неожиданности (по моему мнению, прошу не судить строго, может кому-то и нравится не держать пути под контролем а применять пути относительно директорий, а не корня)
Хочу добавить, что у меня вроде все проекты с ЧПУ и директории эти получается везде виртуальные, потому бессмысленно их учитывать в путях к статике, вот и «думаю от корня», соответственно так и пишу, от корня…
Вы хорошо описали! За это спасибо! Но, наверное, лучше эту тему подробнее описать в разделе уроки. И раздел будет наполняться и найти тему будет проще!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.