Как я могу избежать повторения 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.

Другие вопросы по тегам