web-dev-qa-db-ja.com

ルート.htaccess書き換えルールからディレクトリを除外して、パスワードで保護できるようにしますか?

先週、これを理解しようと多大な時間を費やしましたが、何をしようとしても、これを機能させることはできません。私の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を実行しています。

私は真剣にここで私の知恵の終わりにいます。助けてください。

2
Nate

あなたはすでにこれを試したように思われるでしょう、それは(ポンチャが指摘したように)最も明白な答えであり、おそらく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>
2
Jon Lin

要求されたパスが既存のファイルではなく、既存のディレクトリでもない場合、このルールはホームページに転送されます。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

明らかに、ホームページに転送されているため、サーバーはsub_dirディレクトリが存在しないか、sub_dirの要求が存在しないものにリダイレクトされていると考えています。

このシナリオで最初に確認することは、もちろん、sub_dirが実際のディレクトリであるかどうかです。ただし、ディレクトリ名によっては大文字と小文字が区別されることに注意してくださいApacheが実行されているほとんどの場合、シンボリックリンクは必ずしもディレクトリと同じように扱われないことに注意してください。

1
mootinator

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を実行するとすぐに、親フォルダーのルールは直接適用されません。それらは最初にそのフォルダーから読み取られ、次にルートから読み取られます。

1

上記の解決策は、ルールから除外されるサブフォルダーがパスワードで保護されているという根本的な問題に対処していないため、機能しません。

最初のアクセスがApacheによって拒否され、ログインダイアログボックスが表示されると、書き換えルールが開始されますが、クライアントをアクセス可能なファイルにリダイレクトできないため、404エラーが発生します。この問題を解決するには、最初のアクセス試行が失敗したときにクライアントを転送できる「ダミー」ファイルを提供する必要があります。

ErrorDocument 401 /failed_auth.html
RewriteCond %{REQUEST_URI} ^/pwd-protected-sub-folder/(.*)$ [OR]
RewriteCond %{REQUEST_URI} ^/failed_auth.html$
RewriteRule ^.*$ - [L]
1
Mike L

プレーンなVanillacPanelベースの共有ホスティング(Apache 2.2)を使用しているサイトの場合、ドキュメントルート(public_html)に「401.shtml」という名前のファイルを追加することで、同じ問題のように見える問題を解決しました。 .htaccessにErrorDocument401ディレクティブがなくても、ファイルが存在するだけで問題は解決しました。

0
Giles B

それが他の誰かを助けることを期待してこれを追加します。 @MikeLはこれで正しい方向に進んでいたと思います。私も同様の状況にありました(メインサイトにまだ必要なルートhtaccessに書き換えルールがあるhtaccessパスワードで保護されたサブディレクトリ)。結局のところ、私にとっての解決策は、これをルートの.htaccessファイルに追加することでした。

ErrorDocument 401 "Unauthorised"

もちろん、サブディレクトリへのアクセスを許可するには、関連するルールを追加する必要がありますが、表示されないパスワード要求は上記を使用して修正されました。それが役に立てば幸い!

0
clone

別のRewriteCondを追加して、目的のsub_dirを(両方のルールに)除外します。

RewriteCond %{REQUEST_URI} !^sub_dir
0
poncha