Как сохранить независимость веб-сайта с каталогом маршрутизации URL-адресов

StackOverflow https://stackoverflow.com/questions/276443

  •  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>.

РЕДАКТИРОВАТЬ:Я должен добавить, что приведенный выше абзац предполагает, что вы, как и мы, обслуживаете изображения с другого имени хоста.Если вы этого не сделаете, то, очевидно, это не будет проблемой.

У Томхэя есть хорошая точка зрения, и было бы полезно изучить ее дальше.

В соответствии с MSDN, база тег работает для всех внешних источников, включая таблицы стилей, изображения и т. д.

Возможно, я что-то упускаю, но не можете ли вы просто сделать то, что делаю я (и я думал, что все остальные)?А именно, поместите все ваши изображения, CSS, JavaScript и т. д. в общий каталог, т.е.:

/inc/images/
/inc/css/
/inc/javascript/
etc

А затем ссылайтесь на них с помощью URL-адресов, относящихся к базе, то есть:

<img src="/inc/images/foo.jpg" />
etc

?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top