Как я могу избежать повторения DocumentRoot на этом виртуальном хосте Apache?
У меня есть виртуальный хост Apache, настроенный для веб-сайта на платформе Wordpress.
<VirtualHost *:80>
ServerName 67.178.132.253
DocumentRoot /home/david/wordpressWebsite
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond /home/david/wordpressWebsite%{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
</VirtualHost>
Как я могу избежать жесткого кодирования /home/david/wordpressWebsite
дважды? Я не хочу использовать REQUEST_URI
так как это включает в себя дополнительный запрос.
Вот моя попытка использования контекста каталога. Я сделал файл на сайтах, доступных с этим содержимым.
DocumentRoot /home/david/wordpressWebsite
<Directory /home/david/wordpressWebsite>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
# You need these somewhere, anyway; better to not put them on the root.
Order allow,deny
Allow from all
</Directory>
По какой-то причине Apache ищет файлы в /var/www, как показано в моих журналах ошибок:
[error] [client 69.175.67.64] File does not exist: /var/www/about,
referer: http://67.178.132.253/
2 ответа
Для будущих людей, которые сталкиваются с этим и хотят получить ответ на оригинальный вопрос:
Как я могу избежать повторения DocumentRoot на этом виртуальном хосте Apache?
Доступ к значению директивы DocumentRoot можно получить с помощью переменной сервера
% {DOCUMENT_ROOT}. Это означает, что в примере с OP вместо записи:
RewriteCond /home/david/wordpressWebsite%{REQUEST_FILENAME} !-f
Мы можем написать
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
Поэтому единственное место, где вам следует жестко прописать путь к корневому файлу, - это директива DocumentRoot.
Эти правила Wordpress были построены, чтобы быть внутри <Directory>
контекст, о чем свидетельствует тот факт, что они ищут ^index\.php$
без косой черты; это правило никогда не совпадет в <VirtualHost>
контекст.
Однажды внутри <Directory>
контекст, REQUEST_FILENAME
переменная содержит физическое местоположение файла, как описано в документации:
Полный путь локальной файловой системы к файлу или сценарию, соответствующему запросу, если он уже был определен сервером в момент обращения к REQUEST_FILENAME. В противном случае, например, при использовании в контексте виртуального хоста, то же значение, что и REQUEST_URI.
Итак, попробуйте что-то вроде этого:
<Directory /home/david/wordpressWebsite>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
# You need these somewhere, anyway; better to not put them on the root.
Order allow,deny
Allow from all
</Directory>
Что касается жесткого кодирования это дважды (в обоих DocumentRoot
а также <Directory>
настройки): если вам действительно необходимо по какой-то причине избежать этого, то посмотрите на функцию "переменные файла конфигурации" в Apache 2.4.