web-dev-qa-db-ja.com

.htaccessディレクトリの内容をサブディレクトリにリダイレクトする方法

Webサイトの最上位にあるディレクトリの内容を、1レベル下のサブディレクトリにリダイレクトしようとしています。また、2つのファイルと1つのフォルダーを除外する必要があります。
これまで試したことはありませんが、最後の1つは次のとおりです。

RewriteEngine on

#RewriteCond %{REQUEST_URI} !^exludedfile\.html$ 
#RewriteCond %{REQUEST_URI} !^exludedfile\.html$ 
#RewriteCond %{REQUEST_URI} !^/folder/exludedsubfolder/.*$


RewriteRule ^/folder(.*)$ /folder/subfolder/$1 [R=301,NC,L]

今回、私が間違っていることを教えてください。

5
user70084
RewriteRule ^/folder(.*)$ /folder/subfolder/$1 [R=301,NC,L]

この他の回答で述べたように ...ディレクトリごとの.htaccessファイルでは、RewriteRulepatternが一致しますURLパスからディレクトリプレフィックスを差し引いたものであるため、一致するURLパスはスラッシュで始まりません。そのため、パターンは^folder(.*)$のようになります。

ルート.htaccessファイルを使用する必要がない限り、代わりにリダイレクト元のディレクトリに.htaccessファイルを作成します。したがって、/folder/.htaccessファイル(ドキュメントルートではありません)で、次のことを試してください。

RewriteEngine On
RewriteBase /folder

RewriteCond %{REQUEST_URI} !^/folder/subfolder
RewriteCond %{REQUEST_URI} !^/folder/exclude-file1\.html$
RewriteCond %{REQUEST_URI} !^/folder/exclude-file2\.html$
RewriteCond %{REQUEST_URI} !^/folder/exclude-dir
RewriteRule (.*) subfolder/$1 [R=302,L]

NCフラグはここでは必要ありません。

最初のRewriteCondディレクティブは、リダイレクトループを防ぐためのものです。リダイレクト元のフォルダーのサブフォルダーにリダイレクトしているからです。

302(一時的な)リダイレクトも使用しました。正常に動作していることが確認できたら、301(永続)に変更します(それが意図の場合)。 301はブラウザによってキャッシュされるため、テストに問題が生じる可能性があります。

3
MrWhite