2016-07-24 14 views
0

Ich verwende die .htaccess-Regel, um den Bildverzeichniszugriff direkt zu verhindern. hier ist .htaccess code.htaccess: Bild wird nicht auf Webseite geladen

Deny from all 

und ich legte diese .htaccess-Datei in Image-Verzeichnis.

Problem ist, wenn ich versuche, auf einige der Bilder in der Webseite zuzugreifen, gibt es mir fehlgeschlagen zu laden Bildfehler oder Sie können sagen, Bild nicht vorhanden.

<img class="highlight-right wow animated" src="/img/spark.png" height="192" width="48" alt=""> 

Ich möchte den Zugriff für Personen, die direkt darauf zugreifen, verweigern, aber zumindest sollte es auf der Webseite funktionieren.

Irgendwelche Ratschläge dazu.

Edit: Ich habe versucht, diese Regel

RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost/ [NC] 
RewriteRule \.(jpe?g|gif|bmp|png)$ - [F,NC] 

und

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

Aber beide arbeiten nicht als Bilder werden nicht auf der Webseite zeigt.

+0

Dann müssen Sie eine bedingte Regel basierend auf dem Verweis in Ihrem .htaccess machen. Beachten Sie, dass dies alles andere als perfekt ist und echte Besucher blockieren kann und nicht daran gehindert wird, andere Besucher zu bekommen, abhängig von der Konfiguration des Clients. –

+0

@JuliePelletier Danke für deinen Kommentar.Ich kenne mich mit .htaccess nicht aus. Kannst du etwas mehr erklären. – Ironic

+0

@CalculatingMachine Ich würde Ihre Deny-Regel beibehalten, um alle externen Zugriffe zu blockieren, aber PHP verwenden, um intern auf die Datei zuzugreifen. Siehe meine Antwort. – BeetleJuice

Antwort

1

könnten Sie setzen Ihre .htaccess sie zu blockieren auf der Grundlage der Referrer wie folgt:

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^$ 
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yoursite.com [NC] 
RewriteRule \.(jpg|png|gif)$ http://yoursite.com/errorImage.jpg [NC,R,L] 

Beachten Sie, dass die HTTP_REFERER nicht zuverlässig ist, wie es in den Browser des Clients geändert werden kann, aber es ist die einfachste und effizienteste Methode verfügbar.

Eine robustere Methode würde die Verwendung von Cookies oder Sitzungen erfordern, aber das würde die Serverlast erhöhen und daher die Antwortzeit verringern.

+0

Danke für Ihre Antwort. – Ironic

+0

eine Frage, wenn ich mehrere Arten von Dateien im Verzeichnis habe dann kann ich * verwenden? – Ironic

+0

Nein. Meine Antwort legt eine Regel fest, die das 'errorImage.jpg' für Bilddateien (jpg, png und gif) angibt, wenn der Referrer nicht leer ist und nicht Ihre Site. –

1

Ich möchte den Zugriff für Personen, die direkt darauf zugreifen, aber mindestens sollte auf der Webseite funktionieren.

1. In .htaccess Verwendung Deny from all Regel alle direkten Zugang zu sperren.

2. Ändern Sie Ihre Bildquellenlinks, um auf ein PHP-Skript zu verweisen, das für die Rückgabe des richtigen Bildes zuständig ist.

<img src="/path/to/images.php?f=spark.png"> 

Beachten Sie, wie ich den Bildnamen in einem Parameter übergeben? So weiß PHP, welches Bild angefordert wird. In images.php tun:

$IMG_DIR = '/path/to/images'; //put all protected images here 

$img = $_GET['f']; //the file's name, matches the f= parameter in <img> 

$img_path = $IMG_DIR."/$img"; 
if(!is_file($img_path)){ // make sure this image exists 
    http_response_code(404); //404 not found error 
    exit; 
} 

$extension = pathinfo($img,PATHINFO_EXTENSION); //eg: "png" 
$mimetype = "image/$extension"; //type of image. browser needs this info 
$size = filesize($img_path); 

//tell the browser what to expect 
header("Content-Type: $mimetype"); 
header("Content-Length: $size"); 

//send the file to the browser 
readfile($img_path); 

ich es hier nicht tun, aber dieser Ansatz ermöglicht Ihnen den Zugriff zu beschränken, wie Sie es wünschen. Sie können beispielsweise testen, ob ein Benutzer eingeloggt ist, indem Sie den Inhalt $_SESSION ansehen, bevor Sie entscheiden, ob Sie das Bild zurückgeben möchten.

+0

Danke für Ihre Antwort. – Ironic