index.php と app/dist/* フォルダーへのリクエストのみを許可するように .htaccess に指示するにはどうすればよいですか?

index.php と app/dist/* フォルダーへのリクエストのみを許可するように .htaccess に指示するにはどうすればよいですか?

現在のフォルダは次のとおりです:

/app
  /dist
    /index.html
    /index.css
    /index.js
  /src
    /configurations.json
/index.php
/configurations.php

あらゆる場所に機密データがあります。

  • app/src/...
  • /...

ユーザーがアクセスできるようにしたいのは以下のとおりです。

  • index.php
  • app/dist/whateverfile.whateverformat

フォルダーdistは変更される可能性があるため、このディレクトリに静的にアクセスできるようにして、すべてのファイルをリストする必要がないようにする必要があります。

この構文でこれをどのように行うのでしょうか.htaccess?

にアクセスできるようにするこの構成がありますindex.php。しかし、フォルダーに対してそれを実現する手がかりがありませんdist...

Options -Indexes
DirectoryIndex index.php

<FilesMatch ".*">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

<Files index.php>
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

<Files "">
    Order allow,deny
    Allow from all
    Satisfy All
</Files>

前もって感謝します。

答え1

および指令は<Files><FilesMatch>ファイルディレクトリではありません。サーバー構成にアクセスできる場合は、おそらくコンテナーを使用します<Directory>

mod_rewriteの使用

では、 mod_rewrite を使用して、または.htaccess以外へのアクセスを制限できます。/index.php/app/dist/

例えば:

RewriteEngine On

RewriteRule !^(index\.php$|app/dist/) - [F]

/index.php上記は、 ではない、または を開始しないリクエストに対して 403 Forbidden で応答します/app/dist/。 代わりに 404 を返す場合は、Fに変更しますR=404

正規表現のプレフィックス!は正規表現を否定します。RewriteRule パターンスラッシュで始まっていません。

実際のファイルまたはディレクトリにマップされるリクエストに対してのみ 403 で応答したい場合 (それ以外の場合は 404)、ファイルシステムをチェックする条件をいくつか追加します (ただし、ファイルシステムのチェックは比較的コストがかかるため、必要がない限り使用しないでください)。例:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(index\.php$|app/dist/) - [F]

要求されたURLが許可された「グループ」に含まれていない場合のみそしてファイルまたはディレクトリにマップされるのは、RewriteRuleアクションされるディレクティブです。

ただし、URL には実際には が含まれていないと想定しますindex.php(含まれているのでしょうか?)。その場合、ユーザーが要求し、mod_dir は( )/の内部サブ要求を発行します。その場合、 をオプションにする必要があります。/index.phpDirectoryIndexindex.php

例えば:

RewriteRule !^((index\.php)?$|app/dist/) - [F]

Apache 式の使用

あるいは、Apache 式 (Apache 2.4) を使用してこれを行うこともできます。

<If "%{REQUEST_URI} !~ m#^/((index\.php)?$|app/dist/)#">
    Require all denied
</If>

/上記は、 ではない、/index.phpまたは で始まるURL リクエストに対して 403 で応答します/app/dist/

Order、、AllowなどDenyは古い Apache 2.2 ディレクティブであり、Apache 2.4 では正式に非推奨になっていることに注意してください。


mod_setenvif の使用

別の方法としては、mod_setenvif を使用して、許可された URL パスの 1 つが要求された場合に環境変数を設定し、この環境変数が設定されている場合にのみアクセスを許可するという方法があります。

例えば:

SetEnvIf Request_URI "^/((index\.php)?$|app/dist/)" ALLOWED
Require env ALLOWED

上記は、ALLOWED許可された URL パスのいずれかが要求された場合に env var を設定します。Requireその後、ディレクティブはアクセスを許可するにはこの env var を設定する必要があります。そうでない場合は 403 が返されます。

答え2

これが主な問題である場合:「機密データはどこにでもあります」

これは、その機密情報を Web ルートの外部に移動することで、最も簡単かつ確実に解決されます...

のみを含むWeb ルート ( DocumentRoot)を考えてみましょうindex.php
。そこに他のデータがない場合、それを保護するための複雑なルールも必要ありません...


例えば、Aliasディレクティブ (メイン サーバー構成ファイル内、または Web ルート内のファイル内が望ましい.htaccess) または mod_rewrite ルールを使用して、DocumentRoot ディレクトリ/ファイル外のディレクトリに保存されているドキュメントに URI をマップし、アクセスを明示的に許可します。

つまり

.
`-- some-path
    |-- app
    |   `-- dist
    |       |-- index.css
    |       |-- index.html
    |       `-- index.js
    |-- src
    |   `-- configurations.json
    `-- www.example.com
        |-- .htaccess
        `-- index.php

メインのApache設定/some-path/www.example.comではDocumentRoot参考文献.
.htaccess、/some-path/app/ディレクトリとそのすべての内容をURIパスとして公開するようなものです。http://www.example.com/app/

# /some-path/www.example.com/.htaccess
# exposes/some-path/app/ directory  as the URI path `http://www.example.com/app/`

Alias "/app" "/some-path/app"

Alias "/app/dist" "/some-path/app/dist"または、ディレクティブ内の正規表現をより具体的にしたり、創造的に使用したりしますAlaisMatch

答え3

こうやって:

Options -Indexes
ServerSignature Off 
DirectoryIndex index.php

RewriteEngine on
RewriteRule ^ui(/)?$ app/dist/index.html [QSA,END,NC,L]
RewriteRule ui/(.*) app/dist/$1 [QSA,END,NC,L]
RewriteRule !(ui/.*) index.php [QSA,END,NC,L]

すべての一致後のフラグに注意してくださいEND。このフラグは、一般的な構文をシミュレートするために必要ですif-else。ただし、公式ドキュメントには記載されていません。

ついにNode.jsに移行しました。

関連情報