web-dev-qa-db-ja.com

クエリ文字列を保持しながら、htaccessがサブフォルダーからルートディレクトリにページをリダイレクトする

さまざまなサブディレクトリのページをルートディレクトリに移動しました。各ページに301リダイレクトを設定し、存在する可能性のあるクエリ文字列を保持したいです。例えば:

  • www.example.com/folder/page1.htmlwww.example.com/page1.htmlにリダイレクトします

そして

  • www.example.com/folder2/page2.htmlwww.example.com/page2.htmlにリダイレクトします

時々使用するクエリ文字列が存在する場合は、それを保存してください。リダイレクトする必要がある複数のサブフォルダーにある複数のページがあります。すべてにクエリ文字列が含まれる可能性があります。

ランディングページに明確なクエリ文字列があり、常に同じになるため、クエリ文字列をハードコーディングできるランディングページの単純なリダイレクトを実行しました。ここではそうではありません。

私は次の例を見つけましたが、それが機能するかどうかを知るのに十分なほど理解していない、そしてコンテンツが移動されていないサブフォルダが1つあるので...

RewriteEngine On
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L] 
2
J Green
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L]

これは、特定のサブフォルダー内のallファイルをリダイレクトするのにうまく機能します。クエリ文字列はデフォルトで保持されるため、QSAフラグは不要です。 QSAフラグが必要になるのは、クエリ文字列をsubstitution(つまり、RewriteRuleディレクティブの2番目の引数-ターゲットURL)に含めて、 appendedQuery String Append)のリクエストに対する元のクエリ。

ただし、1つを除いてeveryサブディレクトリをリダイレクトする場合は、リダイレクトしないサブディレクトリに対してexceptionを作成することにより、単一のルールでこれを行うことができます。

たとえば、.htaccessでmod_rewriteを使用する場合:

RewriteCond %{REQUEST_URI} !^/subdir-not-redirected/ [NC]
RewriteRule ^[^/]+/([^/]*)$ /$1 [R=302,L]

.htmlファイルのみをリダイレクトする場合は、正規表現でより具体的にしてください...

RewriteRule ^[^/]+/([^/]*\.html)$ /$1 [R=302,L]

これは、単一のサブディレクトリ内のファイルにのみ一致します。複数のサブディレクトリの深さがあるファイルには一致しません。

これは302(一時)リダイレクトです。テスト中に潜在的なキャッシュの問題を回避するために、正常に動作していることを確認した場合にのみ301(永続)に変更します。


代わりに、既存のmod_rewriteディレクティブがない場合は、代わりに単一のmod_alias RedirectMatchディレクティブを使用してこれを行うこともできます。

RedirectMatch 302 ^/(?!subdir-not-redirected)[^/]+/([^/]*\.html)$ /$1

これはnegative lookaheadを使用して、リダイレクトしたくないサブディレクトリの例外を作成します。 (別のRewriteRuleディレクティブを使用する代わりに、上記のRewriteCondで同じメソッドを使用できます。)

1
MrWhite