.htaccessリダイレクト301の末尾にスラッシュを付けると、末尾のスラッシュが宛先に追加されます

Oct 11 2020

私のウェブサイトをやり直して、変更されたリンクの.htaccessファイルにリダイレクトを設定しようとしています

これは正常に機能しますが、機能しない場合を除きます/example/(ソースパスの末尾にスラッシュがある場合)

Redirect 301 /example /example.php

だから私はこれを末尾のスラッシュを説明するために追加しました:

Redirect 301 /example/ /example.php

しかし、それはにリダイレクトしますexample.php/(宛先に末尾のスラッシュを追加しますが、これは機能しません)

明らかに私はこれを間違っています。より良い方法は何ですか?

回答

4 MrWhite Oct 12 2020 at 01:21

しかし、それはにリダイレクトします example.php/

これは、最初の(元の)ルールが原因です。以前の(誤った)301は、ブラウザによってキャッシュされている可能性が高いことに注意してください。潜在的なキャッシュの問題を回避するために、302(一時的な)リダイレクトでテストします。

Redirectディレクティブは、プレフィックスマッチング(全経路セグメント)であり、一致後のすべてがターゲットURLの末尾に追加されます。したがって、最初のディレクティブは次のようにリダイレクトします。

  • /example/example.php
  • /example//example.php/
  • /example/abc/example.php/abc

ディレクティブがこのように順序付けられている場合、投稿された2つのサンプルURLに対して「機能」するはずです。

Redirect 301 /example/ /example.php
Redirect 301 /example /example.php

ただし、Redirectこれを処理するには2つのディレクティブが必要なため、ディレクティブはここで使用する正しいディレクティブではありません。(通常、Redirectディレクティブで、ソースURLとターゲットURLの両方で末尾のスラッシュを含めるか除外する必要があります。)

RedirectMatch代わりに、正規表現を使用して一致するディレクティブを使用できます。たとえば、末尾のスラッシュがある場合とない場合の両方を処理するには、次のようにします。

RedirectMatch 301 ^/example/?$ /example.php

これは/exampleまたはにのみ一致し/example/、にリダイレクトされ/example.phpます。

RedirectRedirectMatchは両方ともmod_aliasの一部です。

ただし、すでにmod_rewriteを使用している場合はRewriteRule、潜在的な競合を回避するために、代わりにmod_rewriteの使用を検討してください。mod_rewriteは、のディレクティブの明らかな順序関係なく、常にmod_aliasの前に実行されるためです.htaccess。例えば:

RewriteEngine On

RewriteRule ^example/?$ /example.php [R=301,L]

パターンが一致するURLパスでは、ディレクトリプレフィックス(常にスラッシュで終わる)が削除されているため、で使用する場合、RewriteRule パターンにスラッシュプレフィックスがないことに注意してください。.htaccess

各モジュール内のディレクティブの順序が重要になる可能性があることにも注意してください。

余談ですが、ウェブサイトを「やり直した」場合、フォームの「新しい」URLはなぜ/example.phpですか。これは後ろ向きに見えるでしょうか?


更新:誰かに元のワードプレスのウェブサイトを、HTMLと少しのjavascriptとphpだけを使用した(ほぼ)同等のサイトに変換してもらいました

潜在的に、元のWordPress URL(例)を保持し、外部にリダイレクトする代わりに、リクエストを処理する基になるファイル(例/example)にリクエストを内部的に書き換えることができます。このためには、mod_rewriteを使用する必要があります。また、HTMLソースの「古い」WordPressURLにリンクする必要があります。例えば。(そして、末尾のスラッシュを正規化することを検討してください-どちらかにリダイレクトしてください)。example.php/example

するために、内部的に書き換える /example(または/example/に)/example.phpあなたは、単に削除する必要がR上からフラグをRewriteRule指示。例えば:

RewriteRule ^example/?$ example.php [L]

RewriteRule 置換のスラッシュプレフィックスも削除しました。これは、ファイルシステムパスに書き換えているため、現在は必要ありません。)

/exampleHTMLソースにリンクを提供すると、ユーザーはリクエストが実際ににマップされていることに気づきませんexample.php