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 永远不会在目录 上下文中匹配(即在<Directory>
容器内)。它本来应该是这样写的:
RewriteRule ^webmedia/ / [R=301,L]
(后面的(.*)
是多余的。)
但是,由于它位于 <Directory>
容器中,因此您在 .htaccess
中拥有的任何 mod_rewrite 指令(因为您拥有 AllowOverride All
)都可能会覆盖它。
如果您正在使用 .htaccess
并且这是不可取的,那么最好将其从 <Directory>
容器中取出并直接放入 <VirtualHost>
容器中(virtualhost
context ) - 正如@Seybsen 在他的回答中所做的那样。
【讨论】:
以上是关于vhosts 配置中的 mod_rewrite的主要内容,如果未能解决你的问题,请参考以下文章