我的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文件内容可以移动到虚拟主机。什么是错误的?
答案 0 :(得分:3)
根据docs,RewriteBase
“设置每个目录的基本URL重写”。
由于您没有设置每个目录的重写,因此该指令在特定目录的.htaccess文件之外没有意义。
答案 1 :(得分:1)
RewriteBase在虚拟主机文件中不起作用。
您可能想问的问题是:
如何在VHost RewriteRules中包含相对路径?
特别是在vhosts中,* _FILENAME返回斜杠后跟REQUEST_URI,而不是相对或映射到文件系统!
例如,%{SCRIPT_FILENAME}
有几种解决方案:
Solution #1:%{DOCUMENT_ROOT}
RewriteRule ^/foo/bar$ %{DOCUMENT_ROOT}/foo/baz
RewriteCond %{DOCUMENT_ROOT}/%{SCRIPT_FILENAME} !-f
RewriteRule (.*) /script.cgi
Solution #2:<Directory> tags
RewriteEngine On
<Directory "/var/www/">
...
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule (.*) /script.cgi
</Directory>
在目录标记内,* _FILENAME的处理方式与htaccess文件中的处理方式相同 当服务器有多个别名时,可能会出现问题。
Solution #3:%{REQUEST_URI}
尽可能使用%{ _URI}代替%{ _FILENAME} 不是一个真正的答案。只是指出* _URI不必重写,因为它们不应映射到文件系统,因此vhost / htaccess路径是相同的。但是,并不总是可以使用REQUEST_URI,而David Faux在上面评论说它速度较慢。此外,这是