[英]Why does WAMP run script with similar name instead of rewriting URL?
我試圖將所有請求重寫為index.php
,然后根據$_GET['p']
變量中的值確定要包含哪個文件。 例如,我在站點的主目錄leltar
有一個名為update.php
的腳本,如果打開的頁面是localhost/leltar/update
,我希望將其包括在內。
但是,問題是重寫不起作用,因為即使鏈接中沒有.php
擴展名,WAMP也會運行腳本。 輸出只是腳本的輸出,而index.php
沒有顯示任何內容。 如何阻止WAMP運行名稱相似的腳本? 我想我的.htaccess代碼也有問題,因為如果我打開除localhost/leltar/update
之外的頁面,則$_GET['p']
始終都是字符串“ index.php” 。
.htaccess文件:
RewriteEngine On
RewriteRule ^(.*)$ index.php?p=$1
index.php文件:
// ...
switch ($_GET['p']) {
case 'update':
require_once('update.php');
break;
default:
// something else
break;
}
// ...
update.php
的內容不相關。
編輯:主要問題是默認情況下,或者甚至當我使用RewriteCond %{REQUEST_FILENAME} !-f
重寫條件時,如果存在與鏈接的用戶友好端名稱相同的文件,WAMP會以某種方式覆蓋我的重寫規則。 如果我將名為pic.jpg
的圖片放入www
文件夾並打開localhost/pic.jpg
,則圖像顯然會顯示出來。 但是,如果我忽略了訪問頁面localhost/pic
的擴展名,我也會得到相同的輸出(我想不是由於文件夾不存在而導致404 Not Found錯誤)。
編輯2:在真實的服務器上沒有任何問題。 如果我忽略擴展名,則會拋出404錯誤,因此這絕對是WAMP特定的事情。
.htaccess
文件中的規則有效地循環直到URL不變(因為每次都重新啟動處理,這意味着規則也將再次被處理),因此,您的規則當然會循環直到p
等於其自身。
實際上,您實際上不需要p
,您只需在PHP腳本中檢查$_SERVER['REQUEST_URI']
知道原始請求的URI(與下面的REQUEST_URI
,每次重寫都會改變)。
所以只要使用這個:
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^ index.php [L]
但是...您可能希望提供存在的文件,例如圖像,腳本等,因此通常要做的是檢查文件是否存在:
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
盡管這樣做更有效,並列出其中包含您要提供的文件的目錄:
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_URI} !^/(?:images|css|scripts)/
RewriteRule ^ index.php [L]
只需將列表更改為包含靜態文件的目錄的名稱即可。
更新
從注釋中看,您似乎還有另一種重寫方法,即將.php
添加到URL中,因此無需它們就可以工作。 為了不將它們重寫為index.php
,我建議將重寫內容放在這一位置之前。 否則,您可以像這樣檢查URL是否以.php
結尾。 也許將其與文件夾檢查結合起來,而不是進行兩次文件系統檢查。
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteCond %{REQUEST_URI} !^/(?:images|css|scripts)/
RewriteRule ^ index.php [L]
您可以將特定的文件例外添加到第三條規則中,如下所示:
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_URI} !^/(?:images|css|scripts)/
RewriteCond %{REQUEST_URI} !=/some/url.php
RewriteCond %{REQUEST_URI} !=/some_other_url.php
RewriteRule ^ index.php [L]
確實,正如@SuperDuperApps假定的那樣,問題在於WAMP默認情況下啟用了MultiViews
。 在我的.htaccess
文件中添加Options -MultiViews
解決了我所有的問題,問題中提到的初始代碼現在可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.