Apache 2.4 URL 重寫:/server/?Server=ServerName 至 /server/ServerName
P粉038161873
P粉038161873 2024-01-16 19:21:09
0
1
429

我試著簡單地將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]

此時,我需要一點指導,因為我很沮喪,而且我覺得我錯過了一件簡單的事情。

我嘗試過進行調整:

  • mod_rewrite 查詢字串回傳 404
  • .htaccess 中 $1 與 %1 之間的差異
  • 為什麼使用 .htaccess RewriteRule 時會出現 404 錯誤?
  • 使用 https://httpd.apache.org/docs/2.4/rewrite/remapping.html 中的範例
  • 引用來自 https://cheatography.com/davechild/cheat-sheets/mod-rewrite/ 的標記

我也一直在研究重寫程式碼,試著看看它是否真的在重寫。

使用下面的程式碼成功地將目錄/test2/ 重寫為/server/?Server=ServerName 並且頁面加載正常,因此我知道該模組處於活動狀態並且正在運行.

RewriteRule ^test2/$ /server/?Server=ServerName [PT,L,R=301]

嘗試進行此更改但沒有成功。 URL 不會重寫,但頁面會載入。 Apache 2.4 .htaccess 友善的 URL 重寫

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=? [L]

P粉038161873
P粉038161873

全部回覆(1)
P粉182218860

你似乎搞錯方向了。您應該連結到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,而不是為了讓你的應用程式「工作」。

所以,總而言之,依照以下順序:

  1. 更改 HTML 原始程式碼中的 URL,以便連結到 /server/ServerName 格式的 URL。
  2. (可選)如果您要更改現有URL 結構,請將任何直接請求重定向到/server/?Server=ServerName (或/server/index.php?Server =ServerName) 到/server/ServerName (規格URL)。
  3. 在內部將請求從/server/ServerName(規範URL/您要連結到的URL)重寫為/server/index.php?Server=ServerName (處理請求的底層文件)。

在根.htaccess檔中:

RewriteEngine On

# (OPTIONAL) For SEO, if changing an existing URL structure...
# Redirect "/server/?Server=ServerName" to "/server/ServerName"
RewriteCond %{QUERY_STRING} ^Server=([^&./]+)(&|$) [NC]
RewriteRule ^server/(index\.php)?$ /server/%1 [NE,R=301,L]

# Rewrite request from "/server/ServerName" to "/server/index.php?Server=ServerName"
RewriteRule ^server/([^/.]+)$ server/index.php?Server= [END]

這假設您使用的是 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 時相關。)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!