.htaccess忽略,具体到EC2 – 不是通常的嫌疑人

我运行8-10个基于EC2的Web服务器,所以我的经验是很多小时,但仅限于CentOS; 特别是亚马逊的分销。 我正在使用yum安装Apache,因此获得了Amazon的默认编译Apache。

我想要使​​用mod_rewrite实现从非www(bare / root)域的规范redirect到www.domain.com的search引擎优化,但是我的.htaccess文件一致地忽略了。

我的故障排除步骤(下面概述)使我相信这是亚马逊构buildApache的特定事件。

testing用例

  1. 启动EC2实例,例如Amazon Linux AMI 2013.03.1
  2. SSH到服务器
  3. 运行命令:

    • $ sudo yum install httpd
    • $ sudo apachectl start
    • $ sudo vi /etc/httpd/conf/httpd.conf
    • $ sudo apachectl restart
    • $ sudo vi /var/www/html/.htaccess

在httpd.conf中,我更改了以下内容,在DOCROOT部分/范围中:

 AllowOverride All 

在.htaccess中,补充说:

(编辑,我后来添加了RewriteEngine On

 RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] RewriteRule ^/(.*) http://www.domain.com/$1 [R=301,L] 

.htaccess上的权限是正确的,AFAI可以告诉:

$ ls -al /var/www/html/.htaccess -rwxrwxr-x 1 git apache 142 Jun 18 22:58 /var/www/html/.htaccess

其他信息:

 $ httpd -v Server version: Apache/2.2.24 (Unix) Server built: May 20 2013 21:12:45 $ httpd -M Loaded Modules: core_module (static) ... rewrite_module (shared) ... version_module (shared) Syntax OK 

期望的行为

 $ curl -I domain.com HTTP/1.1 301 Moved Permanently Date: Wed, 19 Jun 2013 12:36:22 GMT Server: Apache/2.2.24 (Amazon) Location: http://www.domain.com/ Connection: close Content-Type: text/html; charset=UTF-8 

实际行为

 $ curl -I domain.com HTTP/1.1 200 OK Date: Wed, 19 Jun 2013 12:34:10 GMT Server: Apache/2.2.24 (Amazon) Connection: close Content-Type: text/html; charset=UTF-8 

故障排除步骤

在.htaccess中,补充说:

 BLAH BLAH BLAH ERROR RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] RewriteRule ^/(.*) http://www.domain.com/$1 [R=301,L] 

我的服务器抛出了一个错误500,所以我知道.htaccess文件被处理。

如预期的那样,它创build了一个错误日志条目: [Wed Jun 19 02:24:19 2013] [alert] [client XXX.XXX.XXX.XXX] /var/www/html/.htaccess: Invalid command 'BLAH BLAH BLAH ERROR', perhaps misspelled or defined by a module not included in the server configuration


由于我在服务器上拥有root访问权限,所以我试着将重写规则直接移到httpd.conf文件中。 这工作。 这告诉我们几件重要的事情正在工作。

 $ curl -I domain.com HTTP/1.1 301 Moved Permanently Date: Wed, 19 Jun 2013 12:36:22 GMT Server: Apache/2.2.24 (Amazon) Location: http://www.domain.com/ Connection: close Content-Type: text/html; charset=UTF-8 

但是,它困扰着我,它不能在.htaccess文件中工作。 我还有其他用例,我需要它在.htaccess中工作(例如,一个具有命名虚拟主机的EC2实例)。

预先感谢您的帮助。

您可以将RewriteRules放入服务器configuration或.htaccess中。 然而,不同的是,在服务器configuration中工作的规则不一定在.htaccess上下文中工作,反之亦然。 .htaccess文件(和目录上下文)中的RewriteRules与相对URL匹配,所以以/开头的规则永远不会匹配。 启用rewritelog,你会看到。

所以对于asume docroot是/ var / www,你请求http://myserver.com/foo/bar.html

服务器configuration中的重写规则将与/foo/bar.html匹配

上下文中的重写rul或/ var / www / foo中的.htaccess文件中的重写将仅与bar.html进行匹配。 所以如果以/开头,它将永远不会匹配。

意识到这一点很重要,我一般认为在.htaccess文件中重写文件的原因之一是一个坏主意。 如果可以避免的话,我通常会强烈build议在.htaccess文件中使用rewriterule(并且可以访问httpd.conf)。 .htaccess文件中的RewriteRules通常会导致难以诊断的行为,并且会造成巨大的性能下降。

另请参阅apache文档: http : //httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule

“在目录和htaccess上下文中,模式最初将与文件系统path相匹配,除去导致服务器到当前RewriteRule的前缀(例如”app1 / index.html“或”index.html“,取决于指令的位置被定义)“。