Как сохранить независимость веб-сайта с каталогом маршрутизации URL-адресов
-
07-07-2019 - |
Вопрос
Я разрабатываю веб-сайт PHP, который использует маршрутизацию URL-адресов.Я бы хотел, чтобы сайт был независимым от каталога, чтобы его можно было переместить из http://site.example.com/ к http://example.com/site/ без необходимости менять каждый путь в HTML.Проблема возникает, когда я ссылаюсь на файлы, которые не подлежат маршрутизации, например файлы CSS, изображения и т. д.
Например, предположим, что представление действия index
контроллера welcome
содержит изображение img/banner.jpg
.Если страница запрашивается с URL-адресом http://site.example.com/добро пожаловать, браузер запросит изображение как http://site.example.com/img/banner.jpg, что совершенно нормально.Но если страница запрошена с URL-адресом http://site.example.com/welcome/index, браузер подумает, что welcome
является каталогом и попытается получить изображение как http://site.example.com/welcome/img/banner.jpg, что явно неверно.
Я уже рассматривал некоторые варианты, но все они мне кажутся неидеальными:
Используйте перезапись URL-адресов для перенаправления запросов с (*.css|*.js|...) или (CSS/*|js/*|...) на правильный путь.
Проблемы:Каждое расширение должно быть названо в правилах перезаписи.Если кто-то добавит новый тип файла (например.mp3-файл), он не будет переписан.
Добавьте базовый путь к каждому относительному пути с помощью функции PHP.Например:
<img src="<?php echo url::base(); ?>img/banner.jpg" />
Проблемы:Выглядит грязно; CSS- и js-файлы, содержащие пути, должны обрабатываться PHP.
Итак, как сохранить независимость каталога веб-сайтов?Есть ли способ лучше/чище, чем тот, который я придумал?
Решение
Вы могли бы положить в голову
<base href="<?php echo url::base(); ?>" />
Это будет означать, что браузер будет запрашивать любые неабсолютные URL-адреса относительно этого пути. Однако я не уверен, как это повлияет на URL-адреса, встроенные в файлы CSS и т. д. Это не влияет на пути, определенные в файлах CSS.(спасибо mooware)
Другие советы
В <base>
вещь будет работать, но вы должны помнить, что это повлияет на вашу <a>
теги тоже.Рассмотрим этот пример:
<!-- this page is http://oursite.com/index.html -->
<html>
<head>
<base href="http://static.oursite.com/" />
</head>
<body>
<img src="logo.gif" alt="this is http://static.oursite.com/logo.gif" />
<a href="/login">this links to http://static.oursite.com/login which is not what we wanted. we wanted http://oursite.com/login</a>
</body>
</html>
Если вы используете вызов функции PHP для создания ссылок, это не будет проблемой, поскольку вы можете просто убедиться, что она выдает абсолютный URL-адрес.Но если вы (или ваши дизайнеры) вручную закодируете <a>
теги, то вы снова столкнулись с той же проблемой, только сейчас с <a>
вместо <img>
.
РЕДАКТИРОВАТЬ:Я должен добавить, что приведенный выше абзац предполагает, что вы, как и мы, обслуживаете изображения с другого имени хоста.Если вы этого не сделаете, то, очевидно, это не будет проблемой.
Возможно, я что-то упускаю, но не можете ли вы просто сделать то, что делаю я (и я думал, что все остальные)?А именно, поместите все ваши изображения, CSS, JavaScript и т. д. в общий каталог, т.е.:
/inc/images/
/inc/css/
/inc/javascript/
etc
А затем ссылайтесь на них с помощью URL-адресов, относящихся к базе, то есть:
<img src="/inc/images/foo.jpg" />
etc
?