我試著簡單地將URL 從/server/?Server=ServerName
重寫為/server/ServerName
,以便ServerName
參數被傳遞給PHP 。
我目前在我的 .htaccess
檔案中包含此內容:
RewriteEngine on RewriteBase / RewriteCond %{QUERY_STRING} Server=([^&]+) RewriteRule "^server/$" "/server/%1/?"
嘗試檢視 /server/ServerName
或 /server/?Server=ServerName
時,出現 404 錯誤。
這是我的重寫日誌:
init rewrite engine with requested uri /server/ pass through /server/ strip per-dir prefix: C:/wamp64/www/server/ -> server/ applying pattern '^server/$' to uri 'server/' RewriteCond: input='Server=ServerName' pattern='Server=([^&]+)' => matched rewrite 'server/' -> '/server/ServerName/?' split uri=/server/ServerName/? -> uri=/server/ServerName/, args=<none> trying to replace prefix C:/wamp64/www/ with / trying to replace context docroot C:/wamp64/www with context prefix internal redirect with /server/ServerName/ [INTERNAL REDIRECT]
此時,我需要一點指導,因為我很沮喪,而且我覺得我錯過了一件簡單的事情。
我嘗試過進行調整:
我也一直在研究重寫程式碼,試著看看它是否真的在重寫。
使用下面的程式碼成功地將目錄/test2/
重寫為/server/?Server=ServerName
並且頁面加載正常,因此我知道該模組處於活動狀態並且正在運行.
RewriteRule ^test2/$ /server/?Server=ServerName [PT,L,R=301]
嘗試進行此更改但沒有成功。 URL 不會重寫,但頁面會載入。 Apache 2.4 .htaccess 友善的 URL 重寫
RewriteRule ^server/([^/\.]+)/?$ /server/?Server=? [L]
你似乎搞錯方向了。您應該連結到HTML 來源中的
/server/ServerName
,因此在內部將請求從/server/ServerName
重寫為 /em>/server/ index.php?Server=ServerName
(請注意新增index.php
,如註解所述)。/server/index.php?Server=ServerName
是實際處理請求的底層(隱藏)檔案路徑。儘管你似乎在最後一行中就已經提到了...
URL 必須重寫,否則頁面將無法載入。對於「重寫」到底是什麼可能存在一些困惑。這不會更改 URL。您不使用
.htaccess
來更改 URL。您必須在 HTML 來源中手動變更 URL - 您要連結到的 URL。如果您願意,您可以(可選)稍後實現外部「重定向」 - 這確實會更改 URL。但這僅用於重定向可能連結到舊網址或對其建立索引的搜尋引擎和第三方。所以,這是為了 SEO,而不是為了讓你的應用程式「工作」。
所以,總而言之,依照以下順序:
/server/ServerName
格式的 URL。/server/?Server=ServerName
(或/server/index.php?Server =ServerName) 到
/server/ServerName
(規格URL)。/server/ServerName
(規範URL/您要連結到的URL)重寫為/server/index.php?Server=ServerName
(處理請求的底層文件)。在根
.htaccess
檔中:這假設您使用的是 Apache 2.4,以便能夠在最後一條規則中使用
END
標誌。這避免了在檢查直接請求而不是「重寫」請求的第一條規則中必須有一個額外的條件(以避免重定向循環)。在第一條規則(「重定向」)中,
index.php
部分是可選的。%1
反向引用包含在前面的條件中捕獲的Server
URL 參數的值。Server
URL 參數必須非空且不包含點或斜線(根據您在上一條規則中給出的正規表示式),否則不會重定向或重寫。請注意,正規表示式字元類別中的文字點不需要反斜線轉義。請注意,我假設(根據您的範例)所請求的URL 不以尾部斜線結尾(即
/server/ServerName
而不是/server/ ServerName/),因此我刪除了RewriteRule
pattern 末尾的可選/?
最後一條規則。儘管您的日誌摘錄似乎另有暗示?如果您確實需要允許尾隨斜杠和非尾隨斜杠URL,那麼這應該作為單獨的“重定向”實現,以便規範化URL,而不是作為“重寫”的一部分,否則會促進重複內容(斜杠和無斜線URL 是不同的URL)。根據您在
Server
URL 參數值中期望的值,NE
(noescape
) 標誌可能是也可能不是必需的。QUERY_STRING
伺服器變數已進行 URL 編碼。您不需要在
.htaccess
中使用PT
(passthrough
) 標誌,因為這是此上下文中的預設行為。 (PT
標誌僅在伺服器 或虛擬主機 上下文中使用 mod_rewrite 時相關。)