Apache-2.2

mod_rewrite 不轉發 GET 參數

  • February 22, 2020

我在我的開發機器上使用 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中使用或將其全部保留來禁用多視圖。

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