Корневой путь в XAMPP

Некоторое время у меня была эта проблема, и я безуспешно искал ответы на все вопросы.

<img src="/images/test.jpg" /> 

Получает изображение из (корневой путь – в моем случае при производстве в LAMP)

  htdocs/images/test.jpg 

Вызывается ли это из htdocs / index.php или htdocs / foo / bar / index.php

Я использую XAMPP в разработке, а внутри htdocs есть папки с проектами, поэтому описанный выше метод будет работать, когда live требует от меня изменить его:

 <img src="/projectName/images/test.jpg" /> 

при работе на местном уровне.

Чтобы упростить эту задачу, я определяю константу BASE, которая в разработке я использую:

 define('BASE','/projectname/) 

И затем, когда я буду жить, я перехожу к:

 define('BASE','/') <img src="<?php echo BASE;?>images/test.jpg" /> 

Это, очевидно, очень раздражает и в конечном итоге вызывает несколько проблем. Пожалуйста, может кто-то пролить свет на эту ситуацию, что я специально хочу сделать, это использовать корневой путь в моих источниках изображения / сценария, но для:

 <img src="/images/test.jpg" /> 

при вызове из htdocs / projectName / foo / test.php

искать изображение в:

 htdocs/projectName/images/ 

Это возможно?

Альтернативный способ справиться с этим – с использованием виртуальных хостов.

Виртуальный хост действует как вторая версия localhost, которая работает специально для подпапки. Например, вы можете настроить Apache так, чтобы при посещении http://example (нет .com или чего-то еще) он показывает вам контент из http://localhost/example/ . Все CSS и JavaScript и ссылки будут действовать так, как если бы они работали из корневой папки веб-сайта, поскольку папка с ведущим example была удалена из URL-адреса.

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

Подведем итог, вот что говорит вам статья:

  • Включить виртуальные хосты в Apache
  • Настройте его так, чтобы при посещении example вы отправили 127.0.0.1
  • Настройте Apache так, чтобы, когда кто-то посещает 127.0.0.1 (но, например, имя веб-сайта), он показывает содержимое из папки example .

Так ваш производственный сайт (который является единственным сервером с несколькими веб-сайтами) имеет разные «корни» для каждого веб-сайта.

Вы когда-нибудь думали о базовом теге в заголовке вашего html-контента? http://www.w3schools.com/tags/tag_base.asp

 <head> ... <base href="<$path />"> ... </head> 

получить базовый путь:

 $path = $_SERVER['SERVER_NAME'] == 'production.host' ? '/' : 'projectName'; 

Я думаю, что лучший способ сделать это – с помощью baseurl, установить ваш baseurl в своей конфигурации и использовать его для внешних файлов.

 $config = new Config(); public $baseurl = "http://dev050.nl"; 

Вы можете использовать его тогда как

 $config->baseurl; 

И, может быть, это для вас что-то интересное: http://twig.sensiolabs.org/

надеюсь, что это помогло.

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

 // db connect if($_SERVER['SERVER_NAME'] != "dev.mydomain.org"){ try{ $pdo = new PDO('mysql:host=mysql.***.net;dbname=***;charset=utf8', '***', '***'); }catch(PDOException $ex){ header('Location: error_db.php'); } }else{ try{ $pdo = new PDO('mysql:host=localhost;dbname=***;charset=utf8', '***', '***'); }catch(PDOException $ex){ header('Location: error_db.php'); } } 

Вы можете либо попробовать решение, предоставленное другими в этом потоке (которые являются программными решениями), либо как альтернатива, я делаю что-то другое (решение для установки).

Для меня мне нравится создавать независимую среду, в которой мои проекты и файлы разработки отдельно от XAMPP (я использую XAMPP, но этот принцип применим к другим средам хостинга). Это позволяет мне легко устанавливать новые обновления для XAMPP, когда они становятся доступными, не беспокоясь о моих проектах, а также мне нравится иметь все мои проекты в одной папке, посвященной разработке. Эта папка разработки будет содержать проекты для веб-приложений, мобильных и других сред.

Способ, которым я настроил это, есть у меня папка c:\dev\ , которая будет содержать список моих проектов, каждый проект будет сам по себе. Так, например, c:\dev\project1\ , c:\dev\project2\ и т. Д.

Теперь, после создания этих папок для разработки, я httpd-vhosts.conf файл httpd-vhosts.conf (расположенный в c:\xampp\apache\conf\extra\ ) и файл hosts (расположенный в c:\Windows\System32\drivers\etc\ ) имеют правильные ссылки.

Предположим, что один из моих проектов называется project1 . и он обычно находится в c:\xampp\htdocs\project1 тогда я обычно получаю доступ к нему через браузер, поскольку http://localhost/project1

Однако, чтобы иметь независимую среду и, как объяснялось ранее, я создал бы папку разработки в диске c:\dev , тогда я бы переместил в нее project1 и закончил с c:\dev\project1

Затем, чтобы получить доступ к этому проекту, набрав файл httpd-vhosts.conf в веб-браузере, я httpd-vhosts.conf файл httpd-vhosts.conf расположенный в c:\xampp\apache\conf\extra\ следующим образом:

 <VirtualHost project1.dev:80> ServerAdmin admin@project1.dev DocumentRoot "C:/dev/project1" ServerName project1.dev ServerAlias www.project1.dev ErrorLog "logs/project1.dev.error.log" CustomLog "logs/project1.dev.access.log" combined <Directory "C:/dev/project1"> Options Indexes FollowSymLinks Includes ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> </VirtualHost> 

Кроме того, я должен обновить файл hosts (расположенный в c:\Windows\System32\drivers\etc\ и добавить следующую запись:

 127.0.0.1 project1.dev 127.0.0.1 www.project1.dev 

(где 127.0.0.1 совпадает с вашим локальным хостом . Также обратите внимание, что вам нужно добавить вторую запись в файл hosts для псевдонима www ).

Это позволяет мне получить доступ к моему проекту как: http://project1.dev

Как только это будет установлено, я могу теперь последовательно писать свой код для моей среды разработки и производства, а мои ссылки на root будут работать нормально.

Кроме того, с этой настройкой мне все равно, нужно ли мне обновлять XAMPP или переключаться на LAMP или что-то еще, все, о чем я забочусь, это убедиться, что я позабочусь только об одном файле, который является моим установочным файлом httpd-vhosts.conf , И, как я уже упоминал, я всегда предпочитаю иметь отдельную папку для разработки, и у меня могут быть разные типы проектов в среде разработки, например, мобильные проекты, веб-проекты и т. Д.

Надеюсь это поможет.


Замечание о мультисайте (настройка поддомена)

Если вы хотите настроить многоузловую (настройку субдомена), то после того, как вы включите WordPress для нескольких пользователей в соответствии с инструкциями WordPress, вам необходимо сделать следующее:

Предполагая, что для многопользовательской структуры требуется следующая структура:

 project1.dev www.project1.dev (this is an alias to project1.dev) sub.project1.dev (this is another setup, subdomain) 

Затем вам нужно добавить следующую запись в httpd-vhosts.conf

 <VirtualHost sub.project1.dev:80> ServerAdmin admin@project1.dev DocumentRoot "C:/dev/project1" ServerName sub.project1.dev ErrorLog "logs/sub.project1.dev.error.log" CustomLog "logs/sub.project1.dev.access.log" combined <Directory "C:/dev/project1"> Options Indexes FollowSymLinks Includes ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory> 

И обновите файл hosts чтобы включить

 127.0.0.1 www.project1.dev 

Обратите внимание, что DocumentRoot указывает на тот же каталог как для основного сайта, так и для сайта субдомена.

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

Возможным решением может быть использование mod_rewrite для автоматического изменения пути на вашем сервере разработки

 RewriteCond %{HTTP_REFERER} ^https?://localhost/testsite/ RewriteCond %{REQUEST_URI} \.(jpg|gif|png|bmp)$ RewriteRule ^ /testsite/$1 

Я считаю, что приведенное выше правило mod_rewrite верное, но было бы лучше проверить это самостоятельно.