2015-10-05 25 views
19

Tworzę witrynę, którą chciałbym uczynić prywatną. Najważniejszą częścią jest to, że obrazy w domenie nie mogą być widoczne bez zalogowania się przez użytkownika w pierwszej kolejności. Chciałbym więc cały ruch zostanie przekierowany do www.DOMAINNAME.com/wp-admin (także dla obrazów), jeśli użytkownik nie jest zalogowanyTwórz obrazy prywatne w Wordpress

Oto co próbowałem.

1) Wtyczki. Próbowałem zarówno Wordpress Force Login, wtyczki wp-require-login i Coming soon page and Maintenance mode.

2) Dodawanie funkcji z this answer. Który brzmi:

function is_login_page() { 
    return in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php')); 
} 

function wpse_make_blog_private() { 
    if (! is_user_logged_in() && ! is_admin() && ! is_login_page()) { 
    global $wp_query; 
    $wp_query->set_404(); 
    } 
} 
add_action('wp', 'wpse_make_blog_private'); 

dla tych rzeczy przekierowuje ruch, jeśli pójdę do bezpośredniego adresu URL do obrazu (takich jak http://www.DOMAINNAME.com/uploads/2015/10/foobar.jpg).

Czy to można zrobić?

----------------- EDIT 1 --------------

Mevius wskazał, że może nie być Wordpress załadowany, jeśli wpiszesz bezpośredni URL do obrazu, więc sugeruje, że powinno to być zrobione na poziomie apache.

------------- KONIEC EDIT 1 -----------

+2

Nie wierzę, że WordPress jest nawet załadowany, jeśli masz bezpośredni dostęp do obrazu (tak jak w przypadku bezpośredniej nawigacji do dowolnego innego zasobu statycznego na serwerze). Być może będziesz musiał to zrobić na poziomie Apache'a – rnevius

+0

Hmm ... To dobrze. Czy to oznacza dodanie go do pliku htaccess, prawda? Po prostu dodam ten tag na ten temat. – Zeth

Odpowiedz

12

Możesz to zrobić tak skomplikowane lub tak proste, jak chcesz. Najprostszym jest sprawdzenie strony odsyłającej zgodnie z sugestią Hemnatha Mouli, ale można to łatwo sfałszować.

Jednakże, jeśli chcesz pójść naprawdę głęboko ...;)

Używaj .htacess plik z RewriteRule przepisać wszystkie obrazy do skryptu PHP, który bootstraps Wordpress i sprawdza stan uwierzytelniania użytkownika. Powinieneś również dodać plik .htaccess do folderu ze zdjęciami, aby uniemożliwić bezpośredni dostęp do folderu, aby wykluczyć przypadki brzegowe.

OSTRZEŻENIE: NINIEJSZY KOD JEST PROSTEM DOWODEM KONCEPCJI, ABY UZYSKAĆ ​​ROZPOCZĘCIE !!

.htaccess

RewriteRule ^(.*\.(jpg|gif|png))$ isAuthenticated.php?path=$1

isAuthenticated.php

require_once("wp-blog-header.php"); 

$allowedExtensions = array("jpg", "gif", "png"); 

$path = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR.$_REQUEST["path"]; 
$pathInfo = pathinfo($path); 

// Check if the Wordpress user is logged in and if the file extension is allowed 
// @see https://codex.wordpress.org/Function_Reference/is_user_logged_in 
if (!is_user_logged_in() || !in_array($pathInfo["extension"], $allowedExtensions)) { 
    header("HTTP/1.1 403 Forbidden"); 
    exit; 
} 

if(!file_exists($path)) { 
    header("HTTP/1.1 404 Not Found"); 
    exit; 
} 

// Display the file and set the correct mimetype 
$resource = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($resource, $path); 
finfo_close($resource); 

header("Content-Type: ".$mimetype); 
readfile($path); 
+3

+1 To jest sposób, aby przejść, gdy nie chcesz zmieniać niczego na temat obecnego systemu. W każdym razie lepiej na początku umieścić "prywatne" pliki poza zasięgiem publicznym, ale to prawie taki sam wynik jak ten –

9

Stosować .htaccess

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg)$ - [F] 

Powroty 403 jeśli masz dostęp do obrazu bezpośrednio, ale pozwala im być wyświetlane na stronie.

+0

Naprawdę? próbowałeś tego? Pytam z ciekawości. –

+0

To zdecydowanie naiwne rozwiązanie, nie można na nim polegać. –

1

Użyj.htaccess

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(gif|jpg)$ - [F]