如何避免在此 Apache 虚拟主机中重复 DocumentRoot?

如何避免在此 Apache 虚拟主机中重复 DocumentRoot?

我有一个为由 Wordpress 提供支持的网站配置的 Apache 虚拟主机。

<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因为这会涉及额外的请求。

这是我使用目录上下文的尝试。我在 sites-available 中创建了一个包含这些内容的文件。

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/

答案1

对于未来偶然发现这个问题并希望得到原始问题答案的人来说:
如何避免在此 Apache 虚拟主机中重复 DocumentRoot?

的价值文档根目录可以使用服务器变量来访问指令
%{文档根目录}。这意味着在原始作者的例子中,不要这样写:

RewriteCond /home/david/wordpressWebsite%{REQUEST_FILENAME} !-f

我们可以写

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

因此,您应该对根文件路径进行硬编码的唯一地方是在 DocumentRoot 指令中。

答案2

这些 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 的“配置文件变量”功能

相关内容