2016-08-29 2 views
1

habe ich die folgende Apache configs Setup:Fixing - Bestimmen referer

<IfModule mod_rewrite.c> 
RewriteEngine On 

RewriteCond %{REQUEST_URI} wp-content/uploads/gravity_forms 
RewriteRule .* /cmssystem46/wp-content/uploads/test_script.php [L] 
</IfModule> 

In meiner /cmssystem46/wp-content/uploads/test_script.php Datei habe ich Setup den folgenden Code ein:

<?php 
/* Short and sweet - load the bare-bones of WordPress*/ 
define('WP_USE_THEMES', false); 
require('../../wp-blog-header.php'); 



if (!is_user_logged_in()) { 
    auth_redirect(); // THIS PART WORKS ALREADY 
}else{ 
    $a = explode ('/', $_SERVER['REQUEST_URI']); 
    array_shift($a); 
    array_shift($a); 
    $c = implode('/', $a); 
    header('Location: '.get_site_url().'/'.$c.''); 
    exit(); 
} 

Sehen Sie das Problem? Zwischen einer Ressource in wp-content/uploads/gravity_forms/* und der Datei test_script.php gibt es eine Endlosschleife.

Ich muss das beheben. Vom Konzept her klingt das sehr einfach: Ich füge eine neue Apache-Regel wie folgt hinzu:

RewriteCond %{HTTP_REFERER} /cmssystem46/wp-content/uploads/test_script.php 
RewriteRule .* - [L] # i.e. don't do anything if the php script is redirecting back to this resource. 

... Dies funktioniert jedoch nicht. Ihre Hilfe würde sehr geschätzt werden!

Kurz Hintergrund

Ich bin so mit der Sicherung der wp-content/uploads/gravity_forms Ordner damit beauftragt, dass nur Wordpress-authentifizierte Benutzer Zugriff auf seine Dateien/Medien haben.

Die Apache. Htaccess rewriterules (oben) sagt "alle HTTP-Anforderungen an die Wp-content/uploads/gravity_forms Verzeichnis sollte an die wp-content/uploads/test_script.php-Datei für die Verarbeitung gerichtet werden."

Sobald ein Benutzer zu der Datei test_scirpt.php kommt, werden sie überprüft, ob sie bei WP angemeldet sind. Wenn nicht, werden sie zum WordPress-Anmeldebildschirm weitergeleitet. Das alles funktioniert.

Wenn sie in WordPress authentifiziert werden, werden sie auf ihre ursprüngliche wp-content/uploads/gravity_forms/* Datei umgeleitet, die sie anfordern wollten.

Dies ist eine Erklärung des Codes, den ich oben eingefügt habe.

Was jetzt passiert, ist, dass die PHP-Datei und die Apache-htaccess-Datei miteinander verheiraten; Ich muss Apache sagen "Stoppt den Umleitungsprozess, wenn der Referer, der gerade den Aufruf von wp-content/uploads/gravity_forms/* gemacht hat, test_script.php ist" ... macht das mehr Sinn?

+0

Also, was macht Ihre 'get_site_url(). $ c' generieren? wahrscheinlich hast du php umleiten von P-> Q, und dann springt dein htaccess direkt zurück mit 'Q-> P' –

+0

Hey Marc - get_site_url(). $ c ist wörtlich die URL, auf die der Benutzer anfänglich zuzugreifen versuchte. Also auf meinem localhost-Rechner wird die literale URL: "http: // localhost/cmssystem46/wp-content/uploads/gravity_forms/' – MustafaG

+0

Ich sollte klar sein: auf der Adressleiste des Browsers des Browsers ändert sich die URL nie während dieser Umleitungen. Dies sind alles interne Weiterleitungen. – MustafaG

Antwort

0

Ich würde den Client nicht zu seiner ursprünglichen Anfrage umleiten. Ich würde lieber nur die Datei aus dem Skript selbst, z. (Teilweise aus http://php.net/manual/en/function.readfile.php#example-2687 genommen)

if (!is_user_logged_in()) { 
    auth_redirect(); // THIS PART WORKS ALREADY 
} else { 
    $basedir = '/path/to/wp-content/uploads/gravity-forms/'; 
    $file = realpath($basedir . $_SERVER['REQUEST_URI']); 
    if ($file === false || strpos($file, $basedir) !== 0 || !file_exists($file)) { 
     // error 
    } else { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($file)); 
     readfile($file); 
     exit; 
    } 
} 

Auf diese Weise vermeiden Sie die Umleitung Schleife, eine Rundfahrt auf dem Client, und auch dazu dienen, die Datei schneller.

+0

Hey Olaf, danke - ich hätte hier aktualisieren sollen, dass ich zu einer Lösung gekommen bin, sehr ähnlich zu dem, was du vorgeschlagen hast. Diese Antwort von Ihnen sollte für jeden anderen hilfreich sein, der auf ein ähnliches Problem wie ich stoßen könnte. – MustafaG