Apache-2.2

在 Ubuntu 12.04 上檢查 Apache 2.2 的健全性檢查 mod_rewrite

  • October 27, 2015

摘要:我正在測試一個簡單的包羅萬象的重寫規則。它似乎沒有生效,沒有被記錄,我也沒有收到任何錯誤。


我是一名初級伺服器管理員,試圖更好地了解如何配置 Apache Web 伺服器。現在我正在閱讀一些文件並在 Ubuntu 12.04.5 LTS(Precise Pangolin)上試驗 Apache/2.2.22。

我讀過的一條建議是,使用 mod_rewrite 明確要求 HTTP/1.1 並拒絕 HTTP/1.0 請求是一個很好的策略。給出的範常式式碼如下:

RewriteEngine On
RewriteCond %{THE_REQUEST} !HTTP/1\.1$
RewriteRule .* - [F]

我嘗試將此塊添加到我的配置文件中:

/etc/apache2/conf.d/security

我還檢查以確保 mod_rewrite 已啟用並且沒有其他衝突的重寫規則,例如:

$ sudo a2enmod rewrite

>   Module rewrite already enabled

$ grep -Firl 'Rewrite' /etc/apache2/

>   /etc/apache2/conf.d/security
>   /etc/apache2/mods-enabled/rewrite.load
>   /etc/apache2/mods-available/rewrite.load

然後我重新啟動 Apache 並使用 curl 測試了新配置:

curl --http1.0 127.0.0.1

不幸的是,我返回了預設的歡迎頁面,而不是預期的 403 FORBIDDEN 響應。經過一番修改後,我最終得到了以下重寫配置(在 /etc/apache2/conf.d/security 中):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3
RewriteCond %{THE_REQUEST} ^.*$
RewriteRule ^.*$ - [F]

我再次得到 Apache 預設歡迎頁面,而不是預期的 403 FORBIDDEN 響應。這是一個範例會話,我在其中使用 curl 測試伺服器,然後檢查日誌文件(重寫、錯誤和訪問日誌):

$ sudo service apache2 restart

>   * Restarting web server apache2
>   ... waiting .                           [OK ]

$ curl 127.0.0.1

>   <html><body><h1>It works!</h1>
>   <p>This is the default web page for this server.</p>
>   <p>The web server software is running but no content has been added, yet.</p>
>   </body></html>

$ sudo tail -1 /var/log/apache2/rewrite.log

>

$ sudo tail -2 /var/log/apache2/error.log

>   [Sun Oct 25 18:13:13 2015] [notice] caught SIGTERM, shutting down
>   [Sun Oct 25 18:13:13 2015] [notice] Apache/2.2.22 (Ubuntu) configured -- resuming normal operations

$ sudo tail -1 /var/log/apache2/access.log

>   127.0.0.1 - - [25/Oct/2015:18:13:16 +0000] "GET / HTTP/1.1" 200 402 "-" "curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3"

是什麼賦予了?

我在 Apache httpd 郵件列表 (users-help@httpd.apache.org) 上收到了 Eric Covener 的答复,他告訴我重寫規則不會被虛擬主機繼承。

Ubuntu Apache 安裝預配置了一個包羅萬象的預設虛擬主機,它沒有繼承重寫設置。將相同的配置設置複製粘貼到虛擬主機主體中會導致預期的行為。

再次查閱文件後(有了這個新見解),我注意到 mod_rewrite 參考中關於虛擬主機的以下部分:

為了讓給定的虛擬主機繼承重寫規則,該虛擬主機配置塊的主體中需要以下指令:

RewriteEngine On
RewriteOptions Inherit

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