2

我有一个包含此内容的 Wordpress 网站的 .htaccess 文件。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

我将此内容移动到我的站点的 Apache 虚拟主机中(如下)并删除了 htaccess 文件。

<VirtualHost *:80>
ServerName 68.183.153.223
DocumentRoot /home/david/wordpressWebSite

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

</VirtualHost>

但是,当我尝试重新启动 Apache 时,Apache 输出错误。

RewriteBase: only valid in per-directory config files
Action 'restart' failed.

我认为可以将 htaccess 文件内容移动到虚拟主机。什么是错?

4

2 回答 2

5

根据文档RewriteBase“为每个目录重写设置基本 URL”。

由于您没有设置每个目录的重写,因此该指令在特定目录的 .htaccess 文件之外毫无意义。

于 2012-05-31T15:17:45.973 回答
2

RewriteBase 在虚拟主机文件中不起作用。

你可能想问的问题是:

如何在 VHost RewriteRules 中包含相对路径?

特别是,在 vhosts 中,*_FILENAME 返回一个斜杠,后跟 REQUEST_URI,而不是相对或映射到文件系统!
例如,%{SCRIPT_FILENAME}

  • 在 .htaccess 中:“assets/style.css”
  • 在虚拟主机文件中:“/assets/style.css”
  • 你需要:“/var/www/assets/style.css”

有几种解决方案:

  • 解决方案 #1:%{DOCUMENT_ROOT}

    RewriteRule ^/foo/bar$ %{DOCUMENT_ROOT}/foo/baz
    
    RewriteCond %{DOCUMENT_ROOT}/%{SCRIPT_FILENAME} !-f
    RewriteRule (.*) /script.cgi
    
  • 解决方案#2<Directory> tags

    RewriteEngine On
    <Directory "/var/www/">
        ...
        RewriteCond %{SCRIPT_FILENAME} !-f
        RewriteRule (.*) /script.cgi
    </Directory>
    

    在目录标签中,*_FILENAME 与 htaccess 文件中的处理方式相同。
    当服务器有多个别名时,使用它可能会出现问题。

  • 解决方案#3:%{REQUEST_URI}

    尽可能使用 %{ _URI} 而不是 %{ _FILENAME}
    不是真正的答案。只是指出 *_URI 不必重写,因为它们不应该映射到文件系统,因此 vhost/htaccess 路径是相同的。但是,并不总是可以使用 REQUEST_URI,David Faux 在上面评论说它比较慢。此外,这

于 2013-10-20T20:43:15.640 回答