Php

Apache2:帶有重寫規則的 400 錯誤請求,錯誤日誌中沒有任何內容?

  • February 16, 2016

這讓我發瘋了。

背景:我正在使用 Mac OS X 10.6 自帶的內置 Apache2 和 PHP

我有一個虛擬主機設置如下:

NameVirtualHost *:81

<Directory "/Users/neezer/Sites/">
   Options Indexes MultiViews
   AllowOverride None
   Order allow,deny
   Allow from all
</Directory>

<VirtualHost *:81>
   ServerName lobster.dev
   ServerAlias *.lobster.dev
   DocumentRoot /Users/neezer/Sites/lobster/www

   RewriteEngine On
   RewriteCond $1 !^(index\.php|resources|robots\.txt)
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)$ index.php/$1 [L,QSA]

   LogLevel debug
   ErrorLog /private/var/log/apache2/lobster_error
</VirtualHost>

這是在/private/etc/apache2/users/neezer.conf.

我的程式碼是帶有CodeIgniter 框架lobster project的 PHP 。嘗試載入http://lobster.dev:81/給了我:

400 錯誤請求

通常,我會檢查我的日誌以查看導致它的原因,但我的日誌是空的!我查看了/private/var/log/apache2/error_log/private/var/log/apache2/lobster_error,都沒有記錄與 400 相關的任何消息。我已LogLevel設置debug/private/etc/apache2/http.conf

刪除重寫規則可以消除錯誤,但這些相同的規則適用於我的 MAMP 主機。我已經仔細檢查並rewrite_module載入到我的預設 Apache 安裝中。我http.conf可以在這裡找到:https ://gist.github.com/1057091

是什麼賦予了?如果您需要任何其他資訊,請告訴我。

注意:我不想.htaccess在項目目錄中添加重寫規則(它已簽入 git repo,我不想碰它)。

對於復雜的 mod_rewrite 規則,最好記錄事件序列以查看發生了什麼。使用RewriteLog執行此操作,並啟動RewriteLogLevel以查看詳細資訊。

mod_rewrite 非常靈活,可以用重寫規則做很多事情,而且也相當複雜。如果沒有看到更廣泛的背景,局外人將無法調試您的規則。你可以做的最好的事情是自己調試它。在一個視窗中觀察日誌,同時在第二個視窗中試驗配置更改。做一個小改動,保存文件,重新載入 apache 並再次點擊 URL。重複。

這是 Apache手冊中對 RewriteLog 的一個很好的描述:

重寫日誌

在使用 mod_rewrite 強大而復雜的功能時,幾乎總是需要使用 RewriteLog 來幫助調試。該日誌文件詳細分析了重寫引擎如何轉換請求。詳細程度由 RewriteLogLevel 指令控制。

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