vhosts 配置中的 mod_rewrite

Posted

技术标签:

【中文标题】vhosts 配置中的 mod_rewrite【英文标题】:mod_rewrite in vhosts configuration 【发布时间】:2012-04-27 20:45:24 【问题描述】:

我正在尝试在 vhost 配置中添加 mod_rewrite 规则,但它不起作用。 对于网站“mysite.com”,我想将“/webmedia/”重定向到主页。

这是我所拥有的:

<VirtualHost 192.168.100.142:80>
    ServerAdmin serveradmin@bbgi.com
    DocumentRoot /home/drupal_1
    ServerName mysite.com
    ServerAlias www.mysite.com
    Alias /movies /home/movies/
    ErrorLog /var/log/httpd/mysite.com_err_log
      CustomLog /var/log/httpd/mysite.com_log special
    <Directory /home/drupal_1>
      Options FollowSymLinks Includes ExecCGI
              AllowOverride All
              DirectoryIndex index.html index.htm index.php

      # Rewrite Rules #####################
      RewriteEngine On
      RewriteRule ^/webmedia/(.*) / [R=301,L]
      # end Rewrite Rules #################

    </Directory>
    <Directory /home/movies>
      Options FollowSymLinks Includes ExecCGI
              AllowOverride All
              DirectoryIndex index.html index.htm index.php
    </Directory>

</VirtualHost>

【问题讨论】:

为什么不将您的规则移动到.htaccess 文件中?这将更容易管理,因为您不必在每次修改后重新启动 Apache。 .htaccess 文件越来越大,我听说服务器从 vhosts 文件中读取它的效率更高。对吗? 是的,如果没有AllowOverride All,Apache 可能会更快,因为它不必在每次请求时都读取您的 .htaccess 文件。我猜这里的性能增益非常很小。你目前在你的.htaccess 中有什么让它变大? 它在一个多站点 Drupal 安装中,其中有许多项供 Drupal 工作,但我必须添加许多重写以防止在数据库中记录许多“找不到页面”错误。我们从另一台服务器移出,有很多旧页面和目录试图访问,但它们不再存在。另外我只是想知道如何以我自己的知识。谢谢。 【参考方案1】:

如果您加载了 mod_rewrite,这应该可以工作。

<Directory /home/drupal_1>
    Options FollowSymLinks Includes ExecCGI
    AllowOverride All
    DirectoryIndex index.html index.htm index.php
</Directory>
<Directory /home/movies>
    Options FollowSymLinks Includes ExecCGI
    AllowOverride All
    DirectoryIndex index.html index.htm index.php
</Directory>
<VirtualHost 192.168.100.142:80>
    ServerAdmin serveradmin@bbgi.com
    DocumentRoot /home/drupal_1
    ServerName mysite.com
    ServerAlias www.mysite.com
    Alias /movies /home/movies/
    ErrorLog /var/log/httpd/mysite.com_err_log
    CustomLog /var/log/httpd/mysite.com_log special

    # Rewrite Rules #####################
    RewriteEngine On
    RewriteRule ^/webmedia/(.*) / [R=301,L]
    # end Rewrite Rules #################   
</VirtualHost>

【讨论】:

谢谢你塞布森。就是这样。 如果 .htaccess 文件中的重写更少,而 vhost 配置中的重写更多,我在服务器上会更容易吗?还是没关系?【参考方案2】:
<Directory /home/drupal_1>
  Options FollowSymLinks Includes ExecCGI
          AllowOverride All
          DirectoryIndex index.html index.htm index.php

  # Rewrite Rules #####################
  RewriteEngine On
  RewriteRule ^/webmedia/(.*) / [R=301,L]
  # end Rewrite Rules #################
</Directory>

由于斜杠前缀,这个RewriteRule pattern 永远不会在目录 上下文中匹配(即在&lt;Directory&gt; 容器内)。它本来应该是这样写的:

RewriteRule ^webmedia/ / [R=301,L]

(后面的(.*) 是多余的。)

但是,由于它位于 &lt;Directory&gt; 容器中,因此您在 .htaccess 中拥有的任何 mod_rewrite 指令(因为您拥有 AllowOverride All)都可能会覆盖它。

如果您正在使用 .htaccess 并且这是不可取的,那么最好将其从 &lt;Directory&gt; 容器中取出并直接放入 &lt;VirtualHost&gt; 容器中(virtualhost context ) - 正如@Seybsen 在他的回答中所做的那样。

【讨论】:

以上是关于vhosts 配置中的 mod_rewrite的主要内容,如果未能解决你的问题,请参考以下文章

apache中的vhosts的配置。

配置apache的虚拟机+软件下载

srs配置文件分析

srs配置文件分析

NGINX VHOST配置文件的使用 之四

怎样配置apache的vhosts文件