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.

정규식의 접두사 !는 정규식을 무효화합니다. URL 경로는 다음과 일치합니다.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은 (the ) /에 대한 내부 하위 요청을 발행합니다 . 이 경우 선택사항으로 설정해야 합니다./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 사용

또 다른 대안은 허용된 URL 경로 중 하나가 요청되면 mod_setenvif를 사용하고 환경 변수를 설정하고 이 env var가 설정된 경우에만 액세스를 허용하는 것입니다.

예를 들어:

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

위의 내용은 ALLOWED허용된 URL 경로 중 하나라도 요청되면 env var를 설정합니다. 그런 다음 지시문 Require에서는 액세스 권한을 부여하기 위해 이 환경 변수를 설정해야 하며, 그렇지 않으면 403이 반환됩니다.

답변2

이것이 주요 문제인 경우:"민감한 데이터가 어디에나 있어요"

민감한 부분을 웹 루트 외부로 이동하면 가장 쉽고 안정적으로 해결됩니다.

DocumentRoot다른 데이터 가 index.php
없으면 이를 보호하기 위한 복잡한 규칙도 필요하지 않습니다.


그런 다음 예를 들어 다음을 사용할 수 있습니다.Alias지시문(주 서버 구성 파일이 바람직하거나 .htaccess웹 루트에 있는 파일을 선호하는 경우) 또는 mod_rewrite 규칙을 사용하여 URI를 DocumentRoot 디렉터리/파일 외부 디렉터리에 저장된 문서에 매핑하여 특별히 액세스를 허용할 수 있습니다.

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

기본 아파치 구성이 다음 /some-path/www.example.com으로 정의되는 곳DocumentRootwww.example.com. 그런 다음 /some-path/app/ 디렉토리와 그 모든 내용을 URI 경로로 노출하는 것과 같은 것이 될 수 있습니다
..htaccesshttp://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로 옮겼습니다.

관련 정보