이것은 내가 한 행동입니다.
이동 한 게이트웨이 파일
scripts/
prepend.php
a.php
b.php
public_html/
gateway.php
html files
css files
js files
을 제외하고 공용 폴더 밖으로 PHP 파일 나는 gateway.php
내 PHP 스크립트에 대한 모든 요청을 리디렉션 htaccess로를 사용합니다. 이 파일은 나머지를 처리합니다 : a.php
을 얻으려면 브라우저가 URL /php/a
을 요청해야합니다. /php/b
는
RewriteEngine On
RewriteBase/
RewriteRule ^php/(.*) gateway.php?file=$1.php [END,QSA,NC]
END
규칙을 리디렉션 더 찾고 중지하는 것을 의미합니다 ...
b.php
로 전달됩니다.
NC
은 대소 문자를 구분하지 않는 일치를 의미합니다.
QSA
은 리디렉션 대상에 쿼리 매개 변수가있는 경우 쿼리 매개 변수를 첨부하는 것을 의미합니다.
php.ini
에서 auto_prepend_file
은 scripts 폴더의 파일을 가리 키도록 설정했습니다. 이 파일은 모든 PHP 스크립트보다 먼저 실행되기 때문에이 스크립트를 사용하여 일부 구성을 수행 할 수 있습니다. 부분적으로 허용 된 PHP 스크립트 목록이 있습니다.
prepend.php
//the only scripts that will be allowed to run (besides gateway.php)
Const SAFE_SCRIPTS = '"/path/to/gateway.php","/path/to/a.php" ...';
Const SCRIPTS_PATH = __DIR__; //this file should be in the scripts directory
//block unnknown files. This will prevent a malicious file from running
$file = $_SERVER['SCRIPT_FILENAME'];//should be /path/to/gateway.php
if(strpos(SAFE_SCRIPTS,"\"$file\"")===false) {http_response_code(404);exit;}
gateway.php는 요청 PHP 파일이 허용 목록에 오른쪽 파일
//get the file requested. Comes from the htaccess rule
$file = SCRIPTS_PATH.'/'.$_GET['file'];
//if file is not in the allowed list, abort
if(strpos(SAFE_SCRIPTS,"\"$file\"")===false) {http_response_code(404);exit;}
//load the file that will handle the request
require SCRIPTS_PATH.'/'.$file;
에 요청을 전달입니다 확인하는 담당하고있다
내 설정이 약간 더 복잡하지만 아이디어를 얻을 수 있습니다. 내 스크립트를 공개 웹 폴더 외부에 보관합니다.
왜 '루트'1 레벨 상단을 이동하지 않습니까? 그래서'public_html'과 같은 수준이 될 것입니다. 나는이 방법으로 파일에 접근 할 수 없다고 생각한다. (서버 설정 방법에 달려있다) –
그러면 자바 스크립트에서 스크립트를 액세스 할 수있는 방법이 필요하다. – BeetleJuice
JS가 그 방법으로 파일에 액세스 할 수 없다. , 그럴 수있어? – Forget