Apache mod_rewrite - 根本不会发生重写

Posted

技术标签:

【中文标题】Apache mod_rewrite - 根本不会发生重写【英文标题】:Apache mod_rewrite - rewrite doesn't occur at all 【发布时间】:2012-04-03 07:31:57 【问题描述】:

我有一个在 Windows 机器上运行的 Apache 2.2。

我正在尝试添加一些 URL 重写指令,并从最简单的理智开始 - 将每个 URL 重写为 http://www.facebook.com

httpd.conf,我添加了以下内容:

LoadModule rewrite_module modules/mod_rewrite.so

在文件的后面,如下:

重写引擎开启

重写规则 ^(.*)$ http://www.facebook.com [R]

根本不会发生重定向:当我访问现有文件时,我会得到它们。当我访问不存在的地址时,我得到了服务器的 404 页面

我尝试了更复杂的重写,结果相同。

可能是什么问题?是否有任何日志文件我应该检查有关重定向失败的提示?谢谢!

【问题讨论】:

“#”是注释字符。所以你什么都没做。 我的不好 - 问题当然是指未注释的指令。 你把指令放在哪里?它在VirtualHost 块内吗? 添加一个 RewriteLog 和一个 RewriteLogLevel 指令然后查看日志信息 Pekka - 重写指令不在虚拟主机中。我尝试将它放在任何块之外(即文件的最后几行)和目录块内。 (... ) 【参考方案1】:

您必须将重写规则放在虚拟主机块中

<VirtualHost lan-ip:80>

ServerName mysite.com
ServerAdmin admin@mysite.com
DocumentRoot /path/to/site

RewriteEngine on
RewriteRule ^(.*)$ http://www.facebook.com [R]

</VirtualHost>

其中 lan-ip 可以是 localhost,或者更有可能是为 mysite.com 提供服务的专用 ip。对于本地开发,您可以将您的 NIC 别名为 192.168.1.101,并修改 /etc/hosts(在 Linux 上),如下所示:

192.168.1.101 mysite.com

然后在您的浏览器中,您可以访问 mysite.com 并针对本地测试实例进行测试。

【讨论】:

【参考方案2】:

您必须将AllowOveride All 放入您的VirtualHost 部分

<Directory /path/to/your/www/>
    AllowOveride All
</Directory>

【讨论】:

“AllowOveride All”与他的问题无关。事实上,“AllowOveride None”是 Apache 建议的默认设置,因为前者允许所有内容,包括 .htaccess 文件,从而降低 Web 服务器的速度(因为 Apache 会寻找 .htaccess 文件,即使它们在 AllowOveride All 中不存在)。很惊讶这得到了赞成...... @virtualeyes 你肯定永远不会配置 .htaccess 和阅读 apache 文档,对这种评论感到惊讶。 确实,我不使用 .htacess 文件,因为它们会影响性能。如果您阅读 Apache 性能文档,您也会避免使用它们:“httpd.apache.org/docs/2.2/misc/perf-tuning.html”(参见 AllowOveride 部分)。此外,当其他人的问题与此无关时,您不会建议其他人使用“AllowOveride All”;-) 基本上,您实际上是在为用户制造问题,而不是帮助解决手头的问题...

以上是关于Apache mod_rewrite - 根本不会发生重写的主要内容,如果未能解决你的问题,请参考以下文章

apache mod_rewrite 模块未安装

Ubuntu系统启用Apache Mod_rewrite模块

Debian/Ubuntu下安装Apache的Mod_Rewrite模块的步骤

Apache如何开启Mod_rewrite模块以及PHPWind伪静态(全伪)

Apache 的 mod_rewrite VS。 PHP路由?

在Apache中使用mod_rewrite模块重写URL