Nginx

RewriteRule 衝突和斜杠

  • January 4, 2021

我們正在將網站遷移到我們的 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/,因此無法載入菜單。

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

編輯:

剩下的唯一問題是從/ouvidoriato重定向/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。因此,請求到達 second RewriteRule,這會導致您描述的行為。

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

引用自:https://serverfault.com/questions/1048074