Apache-2.2
mod_rewrite 不轉發 GET 參數
我在我的開發機器上使用 mod_rewrite 設置 Apache 時遇到問題。Mod_rewrite 處於活動狀態,並且適用於某些規則。某些規則無法按預期工作,例如:
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
在 static.php 我這樣做(用於調試):
<?php print_r($_GET); print_r($_POST); print_r($_SERVER); die();
哪個列印(從 $_SERVER 數組中刪除了一些項目):
Array ( ) Array ( ) Array ( [SERVER_SIGNATURE] => <address>Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch Server at alpha.prove.no Port 80</address> [SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch [SERVER_ADDR] => 127.0.0.1 [SERVER_PORT] => 80 [REMOTE_ADDR] => 127.0.0.1 [DOCUMENT_ROOT] => /home/veg/workspace/project [SERVER_ADMIN] => webmaster@localhost [SCRIPT_FILENAME] => /home/veg/workspace/project/static.php [REMOTE_PORT] => 38954 [GATEWAY_INTERFACE] => CGI/1.1 [SERVER_PROTOCOL] => HTTP/1.1 [REQUEST_METHOD] => GET [QUERY_STRING] => [REQUEST_URI] => /static/no/startCar [SCRIPT_NAME] => /static.php [PATH_INFO] => /no/startCar [PATH_TRANSLATED] => redirect:/index.php/startCar [PHP_SELF] => /static.php/no/startCar [argv] => Array ( ) [argc] => 0 )
不知何故,根據規則設置的 GET 參數沒有通過。相同的 .htaccess 文件正在其他設置中使用,並且執行良好。此虛擬域的 Apache 配置:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName project.example.com DocumentRoot /home/veg/workspace/project <Directory /home/veg/workspace/project> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined </VirtualHost>
發生這種情況時,訪問日誌和錯誤日誌不會輸出任何內容。任何想法表示讚賞。
適用於同一文件的規則範例:
RewriteRule ^faq/?$ /static.php?sISOCode=no&sPage=faq
您是否嘗試過使用QSA(查詢字元串附加)標誌?
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2 [QSA]
編輯,實際答案如下:
此問題是由 Apache 的mod_negotiation引起的,特別是您使用的 MultiViews 選項:
MultiViews 的效果如下:如果伺服器收到對 /some/dir/foo 的請求,如果 /some/dir 啟用了 MultiViews,並且 /some/dir/foo 不存在,則伺服器讀取目錄尋找名為 foo.* 的文件,並有效地偽造了一個類型映射,該類型映射為所有這些文件命名,為它們分配相同的媒體類型和內容編碼,如果客戶端按名稱要求其中一個。然後它選擇最符合客戶要求的匹配項。
啟用 Multiviews 會告訴 Apache 在 URI 實際上未指向現有位置時猜測使用哪個文件。
解決方案:
-MultiViews
通過在您的 .htaccess中使用或將其全部保留來禁用多視圖。