현재 폴더는 다음과 같습니다.
/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.php
DirectoryIndex
index.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
으로 정의되는 곳DocumentRoot
www.example.com. 그런 다음 /some-path/app/ 디렉토리와 그 모든 내용을 URI 경로로 노출하는 것과 같은 것이 될 수 있습니다
..htaccess
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로 옮겼습니다.