在 Ubuntu 12.04 上檢查 Apache 2.2 的健全性檢查 mod_rewrite
摘要:我正在測試一個簡單的包羅萬象的重寫規則。它似乎沒有生效,沒有被記錄,我也沒有收到任何錯誤。
我是一名初級伺服器管理員,試圖更好地了解如何配置 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