1. ホーム
  2. apache

[解決済み】htaccess - ブラウザのURLを変更せずにサブフォルダにリダイレクトする。

2022-01-25 01:09:15

質問

私は、Webアプリの構造を持つサブフォルダを含むドメインを持っています。私は .htaccess サブフォルダのウェブアプリの公開フォルダを指すように、ルートドメインに設定しました。それはうまく動作しますが、私がタイプするとき www.example.com ブラウザのURLは www.example.com/subfolder/public しかし、私はそれが変更されないようにしたいと思います。

これは私の .htaccess :

RewriteEngine On
RewriteRule ^.*$ subfolder/public [NC,L]

EDIT

この最初の.htaccessは、サブフォルダ/publicにリダイレクトするために使用されます。

2番目の.htaccessのコードは以下の通りです。 www.example.com/subfolder/public/ :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

解決方法は?

すみません、何が起こっているのか今気づきました。2番目の .htaccess のファイルは、コメントにあるように、サブディレクトリの中にあります。

RewriteRule ^.*$ subfolder/public [NC,L]

以来 public はファイルシステム上の物理ディレクトリなので、内部的にそのディレクトリに書き換える場合は、末尾のスラッシュを含める必要があります。そうしないと、mod_dir はスラッシュを付加して URL を "fix"しようとします。(mod_dir は暗黙のうちに外部リダイレクトを subfolder/public から subfolder/public/ .)

そこで、ルートで代わりに次のようにしてみてください。 .htaccess ファイルを作成します。

RewriteRule .* subfolder/public/ [L]

重要なのは、末尾のスラッシュです。アンカー( ^$ を含む)を RewriteRule パターン をマッチングしているので、必要ありません。 すべて . そして NC フラグも同じ理由で必要ありません。

いつものように、テストの前にブラウザのキャッシュがクリアされていることを確認してください。


UPDATE#1です。 上記の単一ディレクティブは すべて 静的リソースを含む ディレクトリ subfolder/public/ これは、2番目の .htaccess ファイルを使って、 リクエストを正しくルーティングします。静的なリソースを正しく書き換えられるようにするために (HTMLではルート相対URLパスとして表現されます。 "/js/myjs.js" ) を書き換えるには、追加のディレクティブが必要です。

たとえば、すべての .js.css ファイルを、実際の場所である /subfolder/public/...

# Rewrite static resources
RewriteRule (.+\.(?:js|css))$ subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

UPDATE#2です。 上記をより一般的なものにするため、以下のように書き換えます。 任意の 静的なリソース(画像、PDF、.txtなど)は、書き換える前にファイルが存在するかどうかをチェックすることができます。

# Rewrite static resources
RewriteCond %{DOCUMENT_ROOT}/subfolder/public/$1 -f
RewriteRule (.+) subfolder/public/$1 [L]

# Rewrite everything else to the "public" directory
RewriteRule .* subfolder/public/ [L]

これは、もし .css が存在しない場合、それは subfolder/public/ .