我运行8-10个基于EC2的Web服务器,所以我的经验是很多小时,但仅限于CentOS; 特别是亚马逊的分销。 我正在使用yum安装Apache,因此获得了Amazon的默认编译Apache。
我想要使用mod_rewrite实现从非www(bare / root)域的规范redirect到www.domain.com的search引擎优化,但是我的.htaccess文件一致地忽略了。
我的故障排除步骤(下面概述)使我相信这是亚马逊构buildApache的特定事件。
testing用例
Amazon Linux AMI 2013.03.1
运行命令:
$ 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“,取决于指令的位置被定义)“。