.htaccess 被忽略,特定於 EC2 - 不是通常的嫌疑人
我執行 8-10 個基於 EC2 的 Web 伺服器,所以我的經驗是很多小時,但僅限於 CentOS;特別是亞馬遜的分銷。我正在使用 yum 安裝 Apache,因此獲得了 Amazon 的預設 Apache 編譯。
我想使用 mod_rewrite 實現從非 www(裸/根)域到 www.domain.com 的規範重定向以進行 SEO,但我的 .htaccess 文件始終被忽略。
我的故障排除步驟(如下所述)讓我相信這是亞馬遜建構的 Apache 所特有的。
測試案例
- 啟動 EC2 實例,例如
Amazon Linux AMI 2013.03.1
- SSH 到伺服器
- 執行命令:
$ 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 文件已被處理。
正如預期的那樣,它創建了一個錯誤日誌條目:
[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 放在伺服器配置中,或者放在 .htaccess 中。但是,存在一些差異,這意味著在伺服器配置中有效的規則不一定在 .htaccess 上下文中有效,反之亦然。.htaccess 文件(和目錄上下文)中的 RewriteRules 與相對 URL 匹配,因此以 / 開頭的規則永遠不會匹配。啟用重寫日誌,你會看到。
因此,假設 docroot 是 /var/www 並且您請求http://myserver.com/foo/bar.html
伺服器配置中的重寫規則將與 /foo/bar.html 匹配
上下文中或 /var/www/foo 中的 .htaccess 文件中的重寫規則將僅與 bar.html 匹配。因此,如果它以 / 開頭,它將永遠不匹配。
意識到這一點很重要,這也是我通常認為 .htaccess 文件中的重寫規則是一個壞主意的原因之一。如果可以避免的話,我通常強烈建議不要在 .htaccess 文件中使用重寫器(並且您可以訪問 httpd.conf 以便可以)。.htaccess 文件中的重寫規則通常會導致難以診斷行為,並且會對性能造成巨大影響。
另請參閱 apache 文件: http ://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule
“在目錄和 htaccess 上下文中,模式最初將與文件系統路徑匹配,在刪除引導伺服器到目前 RewriteRule 的前綴之後(例如,“app1/index.html”或“index.html”,具體取決於指令的位置已定義)。”