我有一个为由 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 的“配置文件变量”功能。