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
文件。問題是,由於某種原因,當我們訪問/ouvidoria
我們被重定向到的 URL時/ouvidoria/?id=ouvidoria
,這似乎屬於倒數第二條規則。所以這是第一個要解決的問題。第二個是我們可以使用尾部斜杠 (
/ouvidoria/
) 訪問 URL,它不會附加?id=ouvidoria
,但是,該網站的開發方式是根據 URL 載入側邊菜單。它只會在沒有斜杠的情況下載入。即使我們從第一個問題中刪除有問題的規則(這不是解決方案,因為在其他頁面中需要它),它也會重定向/ouvidoria
到/ouvidoria/
,因此無法載入菜單。任何有關如何使這些規則起作用的幫助將不勝感激。
編輯:
剩下的唯一問題是從
/ouvidoria
to重定向/ouvidoria/
。網路標籤截圖:重定向細節:
好吧,由於某種原因,該指令
DirectorySlash Off
現在起作用了。我之前已經嘗試將其設置為關閉,但它會產生錯誤 500。我已經多次重寫這些規則,也許我刪除了與 DirectorySlash 衝突的東西,現在該指令按預期工作。還要感謝@Tero Kilkanen 幫助我解決了第一個問題。
更新了解決“重定向到子目錄”問題的答案。嘗試以下指令集:
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。因此,請求到達 secondRewriteRule
,這會導致您描述的行為。規則的固定版本同時匹配
/ouvidoria/
和/ouvidoria
。