2016-10-10 2 views
2

이것은 이상한 요청처럼 보일 수 있지만 특정 페이지 집합에서 사용자를 리디렉션하고 403 헤더를 설정하여 내 오류 처리기가 해당 헤더를 표시하도록합니다. 필요한 통지. 내 리디렉션 스크립트가 사용자를 리디렉션하지 않습니다. 나는이 두 줄을 제거하면PHP 리디렉션 사용자 및 403 헤더 설정

// Redirect users from sensative pages 
if(!isset($_SESSION['logged_in']) || isset($_SESSION['logged_in']) && $_SESSION['logged_in'] !== "admin") { 
$redirect[] = array(); 
$redirect[] = "uploadImg.php"; 
if (in_array(basename($_SERVER["SCRIPT_FILENAME"]), $redirect)) { 
    header('HTTP/1.1 403 FORBIDDEN'); 
    header('Status: 403 You Do Not Have Access To This Page'); 
    header("Location: index.php"); 
} 
} 

그러나 이상하게도 :

header('HTTP/1.1 403 FORBIDDEN'); 
    header('Status: 403 You Do Not Have Access To This Page'); 

를하고 스크립트합니다

// Redirect users from sensative pages 
if(!isset($_SESSION['logged_in']) || isset($_SESSION['logged_in']) && $_SESSION['logged_in'] !== "admin") { 
$redirect[] = array(); 
$redirect[] = "uploadImg.php"; 
if (in_array(basename($_SERVER["SCRIPT_FILENAME"]), $redirect)) { 
    header("Location: index.php"); 
} 
} 

을 나는이 스크립트를 사용하여 리디렉션을 시도하고있어

사용자를 다시 index.php 페이지로 리디렉션합니다.

특별히 .htaccess이 오류를 처리하고 오류 문서 처리를 수행하도록 헤더를 설정하려고합니다. index.php

ErrorDocument 400 /index.php?err=400 
ErrorDocument 401 /index.php?err=401 
ErrorDocument 403 /index.php?err=403 
ErrorDocument 404 /index.php?err=404 
ErrorDocument 500 /index.php?err=500 
ErrorDocument 502 /index.php?err=502 
ErrorDocument 504 /index.php?err=504 

Options -MultiViews 
RewriteEngine On 
RewriteBase/

RewriteRule ^h/(\d+)/w/(\d+)/a/([a-z]+)/thumb/(.+)$ /gallery/thumb.php?h=$1&w=$2&a=$3&src=$4 [L] 
RewriteRule ^h/(\d+)/w/(\d+)/a/([a-z]+)/watermark/(.+)$ /gallery/watermark.php?h=$1&w=$2&a=$3&src=$4 [L] 

<FilesMatch ".(jpg|png|gif|jpeg)$"> 
ErrorDocument 404 error.png 
</FilesMatch> 

<IfModule mod_headers.c> 
    Header set Access-Control-Allow-Origin http://example.com 
    Header set Access-Control-Allow-Credentials true 
</IfModule> 

그리고 마지막으로 내 오류 처리기 스크립트 :

.htaccess은이 두 라인이 작동 내 리디렉션 스크립트를 중지 이유

if(isset($_GET['err'])) { 
    $error_status = $_GET['err']; 
    switch ($error_status) { 
    case 400: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>400 Bad Request:</strong> There was an error with your request.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 401: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>401 UNAUTHORIZED:</strong> You are not authorized to view this page or directory.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 403: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>403 FORBIDDEN:</strong> You do not have access to this file or directory.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 404: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>404 Error:</strong> The page you are looking for does not exist.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 500: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>500 Internal Server Error:</strong> The server encountered an error. Please try again.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 502: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>502 Bad Gateway:</strong> The server received an invalid response.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 

    case 504: 
     echo '<div class="alert alert-danger alert-top" role="alert">' . PHP_EOL; 
     echo '<a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>' . PHP_EOL; 
     echo '<strong>504 Gateway Timeout:</strong> The server is taking too long to respond.' . PHP_EOL; 
     echo '</div>' . PHP_EOL; 
    break; 
    } 
} 

더 또는 덜 궁금하네요 :

header('HTTP/1.1 403 FORBIDDEN'); 
    header('Status: 403 You Do Not Have Access To This Page'); 

해결책을 찾았습니다. 전자 리디렉션을 해결하지만, 오류 알림이 표시되지 않습니다 : How to send 500 Internal Server Error error from a PHP script

코드를 위에서 선택한 답변 기반으로 :

// Redirect users from sensative pages 
if(!isset($_SESSION['logged_in']) || isset($_SESSION['logged_in']) && $_SESSION['logged_in'] !== "admin") { 
$redirect[] = array(); 
$redirect[] = "uploadImg.php"; 
if (in_array(basename($_SERVER["SCRIPT_FILENAME"]), $redirect)) { 
    header($_SERVER['SERVER_PROTOCOL'] . ' 403 FORBIDDEN', true, 403); 
    header("Location: index.php"); 
} 
} 

기타 시도합니다을 나는 또한 시도에 다음을 변경했습니다 내 원하는 얻을에 영향을

내가 시도 @Parrot의 제안으로 :

// Redirect users from sensative pages 
if(!isset($_SESSION['logged_in']) || isset($_SESSION['logged_in']) && $_SESSION['logged_in'] !== "admin") { 
$redirect[] = array(); 
$redirect[] = "uploadImg.php"; 
if (in_array(basename($_SERVER["SCRIPT_FILENAME"]), $redirect)) { 
    http_response_code(403); 
    header("Location: index.php"); 
} 
} 

W 이 재 했더라도 HICH 그래서 이것은 내 오류 문서의 상단 부분을 변경하는 나에게 동기를 부여 알림을 보여주기 위해 작동하지 않았다 :

if(isset($_GET['err'])) { 
    $error_status = $_GET['err']; 
} 
else { 
    $error_status = http_response_code(); 
} 

을 희망 그냥 원래 http_response_code();를 읽고되지 않았 음.

참고 : 또한 그냥 header("Location: index.php?err=403"); 그러나 나는 주소 표시 줄에 오류 코드를 표시하지 않으 않을 수 있다는 것을 알고 있습니다.

참고 : 참고 : 리디렉션 방식은 중요한 정보가있는 페이지를 보호하기에 가장 안전하지 않지만, 리디렉션하는 페이지는 일반 사용자가 볼 수없는 일반 페이지 일뿐입니다.

+0

당신이'403' 또는'503'을 원하십니까 더 아무것도 필요하지 않습니다 생각? – Barmar

+0

@Barmar'403 Forbidden '또는'401 Unauthorized'하지만'403'을 목표로하고 있습니다. –

+0

질문에 "503 헤더를 설정하십시오" – Barmar

답변

2

은 교체 :

header('HTTP/1.1 403 FORBIDDEN'); header('Status: 403 You Do Not Have Access To This Page');

로 :

http_response_code(403); 난 당신이 :)

+0

.에 추가되었습니다. 리디렉션이 작동하지만 불행히도 알림이 나타나지 않습니다. 내가 스크립트가 작동한다는 것은 내가 알지 못하는 링크가있는'404'를 사용하여 테스트했기 때문에 작동합니다. –