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]

1 つのページを除いて、すべては期待どおりに動作します。そのページは です/ouvidoria。この特定のページには public_html に同じ名前のディレクトリがあるため、RewriteRule は ファイルを指しますouvidoria/index.php。問題は、何らかの理由で/ouvidoriaURL にアクセスすると にリダイレクトされ/ouvidoria/?id=ouvidoria、最後から 2 番目のルールに該当するように見えることです。したがって、これが最初に解決する必要がある問題です。

2 つ目は、末尾にスラッシュ ( /ouvidoria/) を付けて URL にアクセスでき、 が追加されないことです?id=ouvidoriaが、Web サイトはサイド メニューが 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 のみに一致します。そのため、リクエストは 2 番目の に到達しRewriteRule、説明したような動作が発生します。

ルールの修正バージョンは、/ouvidoria/と の両方に一致します/ouvidoria

答え2

まあ、何らかの理由で、ディレクティブはDirectorySlash Off機能するようになりました。以前にもこれを無効にしようとしましたが、エラー 500 が生成されました。これらのルールを何度も書き直しました。おそらく、DirectorySlash と競合するものを削除したため、ディレクティブは期待どおりに機能するようになりました。

また、最初の問題の解決に協力してくれた @Tero Kilkanen にも感謝します。

関連情報