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

Я разрабатываю веб-сайт PHP, который использует URL-маршрутизацию. Мне бы хотелось, чтобы сайт не зависел от каталогов, чтобы его можно было перемещать с http://site.example.com/ на http://example.com/site/ без необходимости изменения каждого пути в HTML. Проблема возникает, когда я ссылаюсь на файлы, которые не подлежат маршрутизации, такие как CSS-файлы, изображения и так далее.

Например, предположим, что представление для действия index контроллера welcome содержит изображение img/banner.jpg. Если страница запрашивается с URL http://site.example.com/welcome,, браузер запросит изображение как 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.

Итак, как вы сохраняете независимость каталога сайта? Есть ли лучший / более чистый способ, чем тот, который я придумал?

Ответы [ 4 ]

8 голосов
/ 09 ноября 2008

Вы могли бы положить в голову

<base href="<?php echo url::base(); ?>" /> 

Это будет означать, что браузер будет запрашивать любые не абсолютные URL-адреса относительно этого пути. Однако я не уверен, как это повлияет на URL, встроенные в файлы CSS и т. Д. Это не влияет на пути, определенные в файлах CSS. (спасибо mooware)

2 голосов
/ 10 ноября 2008

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

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

1 голос
/ 10 ноября 2008

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

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

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

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

1 голос
/ 10 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...