Apache-2.2

.htaccess 被忽略,特定於 EC2 - 不是通常的嫌疑人

  • June 29, 2013

我執行 8-10 個基於 EC2 的 Web 伺服器,所以我的經驗是很多小時,但僅限於 CentOS;特別是亞馬遜的分銷。我正在使用 yum 安裝 Apache,因此獲得了 Amazon 的預設 Apache 編譯。

我想使用 mod_rewrite 實現從非 www(裸/根)域到 www.domain.com 的規範重定向以進行 SEO,但我的 .htaccess 文件始終被忽略。

我的故障排除步驟(如下所述)讓我相信這是亞馬遜建構的 Apache 所特有的。

測試案例

  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 文件已被處理。

正如預期的那樣,它創建了一個錯誤日誌條目: [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”,具體取決於指令的位置已定義)。”

引用自:https://serverfault.com/questions/516939