Абсолютный путь для развертывания в некорневом расположении - PullRequest
3 голосов
/ 14 ноября 2011

Обычно я ссылаюсь на любые ресурсы на своем сайте, используя абсолютный путь , чтобы мне не приходилось беспокоиться о расположении активов относительно текущего файла.

<!-- Using a absolute path. -->
<img src="/images/flag.png" />
<!-- Using a relative path. -->
<img src="../../../images/flag.png" />

Однако на этот раз мне нужно разместить сайт в другом месте, например, http://my-server.com/holiday/.

Как мне поступить?Я ищу решение, которое не требует от меня изменения пути в моих файлах.Как настроить сервер (Apache) для обработки http://my-server.com/holiday/ как «root»?

Уточнение: Мне все еще нужно http://my-server.com/, чтобы вести себя «нормально».То есть он все равно должен указывать на http://my-server.com/index.html, т.е. не перенаправляется на http://my-server.com/holiday/.

Ответы [ 8 ]

2 голосов
/ 23 ноября 2011

Если вы используете Apache, есть одна довольно простая вещь, которую вы могли бы сделать, просто используя переменную SSI в своих путях. Сделайте глобальную замену всех src = "/ на что-то вроде

src="<!--#echo var="prefix" -->/

и затем в вашем htaccess для конкретной папки определите префиксную переменную как / holiday

Для сайтов, у которых нет переменной или SSI, он просто будет отображаться как комментарий или вы можете определить его как пустую строку.

Конечно, это означает, что вам придется включить SSI в Apache.

1 голос
/ 14 ноября 2011

попробуйте добавить это в ваш .htaccess

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?DOMAINNAME.com$
RewriteCond %{REQUEST_URI} !^/holiday/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /holiday/$1
RewriteCond %{HTTP_HOST} ^(www.)?DOMAINNAME.com$
RewriteRule ^(/)?$ holiday/index.php [L]

или посмотрите здесь - Изменение корневой папки с помощью .htaccess

0 голосов
/ 24 ноября 2011

Мне неприятно это говорить, но ни один из вышеперечисленных не дает решения.Ответы @Zoltan и @stslavik были близки, но, к сожалению, не работали при развертывании;Хотелось бы, чтобы один из них работал.

В результате я прибег к использованию комбинации именованных констант и включаемых файлов в PHP.Подробнее: Структура файла для проекта PHP .Обратите внимание, что это не обязательно должен быть PHP;Вы можете использовать другие языки, которые предоставляют аналогичные функции.+1 за @margusholland, чей ответ привел меня к эксперименту с этим решением.

0 голосов
/ 23 ноября 2011

как насчет использования HTML-элемента BASE?http://www.w3.org/TR/html4/struct/links.html#h-12.4

хотя я не уверен, как вы могли бы иметь его в одном html-файле и наследовать его от остальных ваших htmls, так что ваш источник остается неизменным.если ваш сайт только для html, может быть, с фреймами, в противном случае вы можете использовать какое-то подключение на стороне сервера, в зависимости от того, что вы используете (asp, jsp, что угодно).Проверьте эту ссылку для получения дополнительной информации http://www.boutell.com/newfaq/creating/include.html

0 голосов
/ 23 ноября 2011

Если у вас есть список расширений имен файлов, которые следует перенаправить, вы можете использовать условия перезаписи, используя сопоставление с образцом и расширениями.

Другое решение - просто создать каталог / images в корневом каталоге ипозвольте изображениям быть загруженными оттуда.Или есть ссылки на изображения на вашем пути.

0 голосов
/ 23 ноября 2011

EDIT:

Конечно, это будет работать, если вы используете php. Добавление:

<? define(_BASE_, substr($_SERVER['SERVER_NAME'] . "/" . $_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], "/" )) ); ?>

<html>

    <head>
        <script src="<?=_BASE_?>/path_relative_to_project_root"></script>
    </head>

    <body>
        <img src="<?=_BASE_?>/path_relative_to_project_root">
    </body>

</html>
0 голосов
/ 23 ноября 2011

Легко ...

# Assuming mod_rewrite is an option...
<IfModule mod_rewrite.c>
   # Turn it on!
   RewriteEngine on

   # If path is /images/flag.png, connect to /holiday/images/flag.png
   RewriteBase /holiday/
</IfModule>

Предполагая, что я понимаю, что вы имеете в виду, это должно сработать. Точка заказа, этот .htaccess должен быть в / holiday /

Я делаю это локально на MAMP для тестирования веб-сайта, база которого находится в http://localhost:8888/SocialNetwork/ ... Если бы у меня его не было, мои абсолютные пути, скажем, /profile пошли бы в http://localhost:8888/profile/ вместо http://localhost:8888/SocialNetwork/profile

0 голосов
/ 16 ноября 2011

Не думаю, что это случится с тобой, извини.

У вас есть абсолютные пути в ваших документах, и вы хотите, чтобы apache добавлял к ним / выходным, не затрагивая фактическую документацию?Вы можете иметь один или другой, но не оба.

Вам нужно либо выполнить массовое редактирование и добавить каталог самостоятельно, либо переместить images / css / etc в текущий корневой каталог.

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

Редактировать:

Я не прав, но у меня нет вашего ответа.Вы можете использовать IS_SUBREQ в mod_rewrite, чтобы применять условия перезаписи только для подзапросов из вашего /holiday/index.php

...