簡體   English   中英

為什么WAMP運行名稱相似的腳本而不是重寫URL?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM