【问题标题】:How come I can't move the contents of my .htaccess file into my virtual host?为什么我不能将 .htaccess 文件的内容移动到我的虚拟主机中?
【发布时间】:2012-05-31 15:13:54
【问题描述】:

我有一个包含此内容的 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 文件内容可以移动到虚拟主机。有什么不对?

【问题讨论】:

    标签: wordpress apache2


    【解决方案1】:

    根据docsRewriteBase“设置每个目录重写的基本 URL”。

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

    【讨论】:

    • 谢谢,但如果我删除 RewriteBase,就会发生奇怪的事情。换句话说,网站的内容会加载,但 Apache 将指向我的 CSS 的链接视为 Wordpress 中的页面,而不是静态文件。事实上,我的 CSS 的 URL 会重定向到“/wp-content/themes/myTheme/style.css/”,并在末尾添加一个“/”。
    • 样式表的实际 URL 是什么?我怀疑这是由于 %{REQUEST_FILENAME} 在 .htaccess 上下文中的处理方式不同造成的,尽管我不确定我是否看到将添加尾部斜杠。
    • 啊,去掉RewriteBase后问题解决了。我在这里找到了解决方案(marc-abramowitz.com/archives/2005/12/18/…)。 %{REQUEST_FILENAME} 相对于文档根目录。如果没有 htaccess 文件中的 RewriteBase,我必须求助于RewriteCond /home/david/wordpressWebSite%{REQUEST_FILENAME} !-f。否则,将始终发生重写。尽管如此,我不喜欢这个解决方案,因为我在我的虚拟主机中重复“/home/david/wordpressWebSite”两次,这违反了 DRY。你知道我怎么能只提一次吗?
    • 使用%{REQUEST_URI} 而不是%{REQUEST_FILENAME} 可能是您想要的。
    • 谢谢! %{REQUEST_URI} 成功了。我想应该注意这个问题的未来观众,尽管 REQUEST_URI 由于额外的内部子请求而确实存在性能缺陷。 httpd.apache.org/docs/2.0/misc/rewriteguide.html
    【解决方案2】:

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

    你可能想问的问题是:

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

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

    • 在 .htaccess 中:“assets/style.css”
    • 在 vhost 文件中:“/assets/style.css”
    • 您需要:“/var/www/assets/style.css”

    有几种解决方案:

    • Solution #1: %{DOCUMENT_ROOT}

      RewriteRule ^/foo/bar$ %{DOCUMENT_ROOT}/foo/baz
      
      RewriteCond %{DOCUMENT_ROOT}/%{SCRIPT_FILENAME} !-f
      RewriteRule (.*) /script.cgi
      
    • Solution #2:&lt;Directory&gt; 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 在上面评论说它比较慢。此外,这

    【讨论】:

      猜你喜欢
      • 2011-08-30
      • 2021-12-06
      • 2015-08-15
      • 2020-12-01
      • 1970-01-01
      • 2015-05-19
      • 2011-06-18
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多