先週、これを理解しようと多大な時間を費やしましたが、何をしようとしても、これを機能させることはできません。私のWebホストは、これを機能させるために.htaccessファイルについて十分な知識を持っている人は誰もいないと言っています(有望ですよね?)。また、ここや他のWebサイトで何十もの回答を読んだことがありますが、問題を解決することはできません。
契約は次のとおりです。私のCMS-Invision Power Board-Webサイトのルートにある次の.htaccessファイルを生成します。
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
サブディレクトリsub_dir
があります。サブディレクトリにある.htaccessファイルを使用してパスワードで保護する必要があります。 cPanelを使用してパスワード保護を設定しましたが、ウェブサイトのルートにある.htaccessファイルが無効になっている場合は正常に機能します。ただし、Webサイトのルートにある.htaccessファイルが無効になっていない場合は、sub_dir
を参照するとホームページが表示されます。表示されているホームページは、最初は404ページの書き換えと関係があるのではないかと思っていましたが、404ページの書き換え条件やルールを削除してもホームページは表示されたままです。
sub_dir
の.htaccessファイルのコードは次のとおりです。
AuthUserFile "/home/[user]/public_html/.htpasswd"
AuthType Basic
AuthName "subdir"
require valid-user
前述したように、パスワード保護は、ルートディレクトリの.htaccessファイルが無効になっている場合に機能します。下部の書き換え条件とルール(index.phpの行)を削除しても機能しますが、404ページの書き換え条件とルールを削除しても何も影響を受けません。
私は何十もの潜在的な解決策を試しましたが、どれもうまくいきませんでした。いくつか挙げると、以下のPonchaの答えを試してみました。
RewriteCond %{REQUEST_URI} !^sub_dir
私もこれを試しました:
RewriteRule ^/sub_dir - [L]
私が今でも覚えていない他の多くのものと同様に。重要なのは、これまで何も機能していないということです。また、先頭と後続のスラッシュに関して、考えられるすべての組み合わせを試しました。
私のサーバーはApache2.2.22を実行しています。
私は真剣にここで私の知恵の終わりにいます。助けてください。
あなたはすでにこれを試したように思われるでしょう、それは(ポンチャが指摘したように)最も明白な答えであり、おそらくmod_rewriteチュートリアル/ガイドに現れる可能性が最も高いです。 RewriteCond
を使用してディレクトリを除外することにより、条件の一致が%{REQUEST_URI}
に対して行われることに注意してください。これは、/
"で始まります。
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/sub_dir
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]
RewriteCond %{REQUEST_URI} !^/sub_dir
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
編集:
あなたが試したものを見ると、これも間違っています。 htaccessファイルにある場合、RewriteRule
の一致の先頭のスラッシュは不要です。
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteRule ^sub_dir - [L]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} .*\.(jpeg|jpg|gif|png)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /public/404.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
要求されたパスが既存のファイルではなく、既存のディレクトリでもない場合、このルールはホームページに転送されます。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
明らかに、ホームページに転送されているため、サーバーはsub_dir
ディレクトリが存在しないか、sub_dir
の要求が存在しないものにリダイレクトされていると考えています。
このシナリオで最初に確認することは、もちろん、sub_dir
が実際のディレクトリであるかどうかです。ただし、ディレクトリ名によっては大文字と小文字が区別されることに注意してくださいApacheが実行されているほとんどの場合、シンボリックリンクは必ずしもディレクトリと同じように扱われないことに注意してください。
sub_dir
.htaccessでこれを実行して、modrewriteがsub_dir
に伝播しないようにしてみてはいかがでしょう
## turn off rewrite engine
RewriteEngine Off
## now do your auth stuff
AuthUserFile "/home/[user]/public_html/.htpasswd"
AuthType Basic
AuthName "subdir"
require valid-user
また、sub_dir内で機能するように書き換えルールが本当に必要な場合は、その.htaccessファイルで具体的に実行して、混乱が生じないようにします。 RewriteEngine On/Offを実行するとすぐに、親フォルダーのルールは直接適用されません。それらは最初にそのフォルダーから読み取られ、次にルートから読み取られます。
上記の解決策は、ルールから除外されるサブフォルダーがパスワードで保護されているという根本的な問題に対処していないため、機能しません。
最初のアクセスがApacheによって拒否され、ログインダイアログボックスが表示されると、書き換えルールが開始されますが、クライアントをアクセス可能なファイルにリダイレクトできないため、404エラーが発生します。この問題を解決するには、最初のアクセス試行が失敗したときにクライアントを転送できる「ダミー」ファイルを提供する必要があります。
ErrorDocument 401 /failed_auth.html
RewriteCond %{REQUEST_URI} ^/pwd-protected-sub-folder/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/failed_auth.html$
RewriteRule ^.*$ - [L]
プレーンなVanillacPanelベースの共有ホスティング(Apache 2.2)を使用しているサイトの場合、ドキュメントルート(public_html)に「401.shtml」という名前のファイルを追加することで、同じ問題のように見える問題を解決しました。 .htaccessにErrorDocument401ディレクティブがなくても、ファイルが存在するだけで問題は解決しました。
それが他の誰かを助けることを期待してこれを追加します。 @MikeLはこれで正しい方向に進んでいたと思います。私も同様の状況にありました(メインサイトにまだ必要なルートhtaccessに書き換えルールがあるhtaccessパスワードで保護されたサブディレクトリ)。結局のところ、私にとっての解決策は、これをルートの.htaccessファイルに追加することでした。
ErrorDocument 401 "Unauthorised"
もちろん、サブディレクトリへのアクセスを許可するには、関連するルールを追加する必要がありますが、表示されないパスワード要求は上記を使用して修正されました。それが役に立てば幸い!
別のRewriteCond
を追加して、目的のsub_dir
を(両方のルールに)除外します。
RewriteCond %{REQUEST_URI} !^sub_dir