RewriteRule 衝突與尾部斜槓

RewriteRule 衝突與尾部斜槓

我們正在將網站遷移到我們的 cPanel 基礎架構。客戶使用 Nginx 在自己的基礎設施上託管該網站。他向我們發送了他的 Nginx 設定文件,我們將它們轉換為 Apache Rewrite 規則。最終結果(僅顯示相關行)如下所示:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ouvidoria/$ /ouvidoria/index.php
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

一切都按預期工作,除了一頁,即/ouvidoria.該特定頁面在public_html上有一個同名目錄,因此RewriteRule指向該ouvidoria/index.php檔案。問題是,由於某種原因,當我們訪問/ouvidoriaURL 時,我們會被重定向到/ouvidoria/?id=ouvidoria,這似乎落在倒數第二條規則上。所以這是首先要解決的問題。

第二個是我們可以透過尾部斜線 ( /ouvidoria/) 存取 URL,並且不會附加?id=ouvidoria,但是,網站的開發方式是根據 URL 載入側邊選單。它只會在沒有尾部斜線的情況下加載。即使我們從第一個問題中刪除有問題的規則(這不是解決方案,因為其他頁面需要它),它也會重定向/ouvidoria/ouvidoria/,從而無法載入選單。

任何有關如何使這些規則發揮作用的幫助將不勝感激。

編輯:

唯一剩下的問題是從/ouvidoria到 的重定向/ouvidoria/。網路選項卡截圖:

網路選項卡

重定向詳細資訊:

重定向詳情

答案1

更新了答案以解決“重定向到子目錄”問題。試試以下一組指令:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

透過刪除RewriteCond %{REQUEST_FILENAME} !-d,Apache 不會檢查包含所請求資源的目錄是否存在。這可能有助於解決您的問題。


原答案:

我已經有一段時間沒有使用 Apache 規則了,但我認為以下更改將幫助您實現目標:

代替

RewriteRule ^ouvidoria/$ /ouvidoria/index.php

RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]

規則的原始版本僅符合/ouvidoria/URI。因此,請求到達了第二個RewriteRule,這會導致像您所描述的行為。

規則的固定版本同時匹配/ouvidoria//ouvidoria

答案2

好吧,由於某種原因,該指令DirectorySlash Off現在起作用了。我之前已經嘗試過將其關閉,但它會產生錯誤 500。

也要感謝@Tero Kilkanen 幫我解決第一個問題。

相關內容