さまざまなサブディレクトリのページをルートディレクトリに移動しました。各ページに301リダイレクトを設定し、存在する可能性のあるクエリ文字列を保持したいです。例えば:
www.example.com/folder/page1.html
はwww.example.com/page1.html
にリダイレクトしますそして
www.example.com/folder2/page2.html
はwww.example.com/page2.html
にリダイレクトします時々使用するクエリ文字列が存在する場合は、それを保存してください。リダイレクトする必要がある複数のサブフォルダーにある複数のページがあります。すべてにクエリ文字列が含まれる可能性があります。
ランディングページに明確なクエリ文字列があり、常に同じになるため、クエリ文字列をハードコーディングできるランディングページの単純なリダイレクトを実行しました。ここではそうではありません。
私は次の例を見つけましたが、それが機能するかどうかを知るのに十分なほど理解していない、そしてコンテンツが移動されていないサブフォルダが1つあるので...
RewriteEngine On
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L]
RewriteRule ^subfolder/(.*)$ /$1 [R=301,QSA,L]
これは、特定のサブフォルダー内のallファイルをリダイレクトするのにうまく機能します。クエリ文字列はデフォルトで保持されるため、QSA
フラグは不要です。 QSA
フラグが必要になるのは、クエリ文字列をsubstitution(つまり、RewriteRule
ディレクティブの2番目の引数-ターゲットURL)に含めて、 appended(Q
uery S
tring A
ppend)のリクエストに対する元のクエリ。
ただし、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
で同じメソッドを使用できます。)