2016-10-08 3 views
1

Ich benutze ein Skript, um Bilder im laufenden Betrieb durch eine URL zu markieren.Verwenden von "Mod_Rewrite" mit Bild-URL-Parametern

Zum Beispiel: http://example.com/watermark.php?filename=assets/img/temp/temp_share.jpg würde in temp_share.jpg mit einem Wasserzeichen auf dem neuen Bild führen.

Ich versuche mod_rewrite zu verwenden, um die URL zu so etwas wie http://example.com/filename/assets/img/temp/temp_share.jpg

ich den Generator bei this site verwendet, um aufzuräumen und es gab mir RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L].

Aber wenn ich zu http://example.com/filename/assets/img/temp/temp_share.jpg gehen versuchen, bekomme ich einen Fehler von Not Found The requested URL /filename/assets/img/temp/temp_share.jpg was not found on this server.

Ich bin nicht sicher, was ich falsch gemacht habe.

Vollständiger Inhalt meiner .htaccess

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

Options -MultiViews 
RewriteEngine On 
RewriteBase/

RewriteRule assets/styles/style.css assets/styles/style.php [L] 
RewriteRule assets/styles/m.style.css assets/styles/m.style.php [L] 

RewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L] 

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

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

Inhalt watermark.php:

$imgpath=$_REQUEST['filename']; 
header('content-type: image/jpeg'); 
$watermarkfile="assets/img/logo_variations/logo_watermark_75.png"; 
$watermark = imagecreatefrompng($watermarkfile); 
list($watermark_width,$watermark_height) = getimagesize($watermarkfile); 
$image = imagecreatefromjpeg($imgpath); 
$size = getimagesize($imgpath); 
$dest_x = ($size[0] - $watermark_width)/2; 
$dest_y = ($size[1] - $watermark_height)/2; 
imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); 
imagejpeg($image); 
imagedestroy($image); 
imagedestroy($watermark); 

Antwort

2

[^/] ist eine Zeichenklasse aller Zeichen Ausnahme/

Da Ihr Dateinamen zu tun contain/Sie müssen alle Zeichen nach dem "filename /" Token erfassen. Versuchen Sie es zu ändern.

RewriteRule ^filename/(.*)$ /watermark.php?filename=$1 [L] 

Nach tripple überprüfen, ob Ihre Rewrite-Modul aktiviert ist und Sie einen Neustart des Servers durchgeführt, wenn es noch Ihnen nicht funktionieren sollte ausführliche Rewrite Debuggen betrachten ermöglicht Dateien zu protokollieren.

Sie sollten auch eine zusätzliche Sicherheitsprüfung für den Bildpfad in Erwägung ziehen. Es ist sehr einfach für jemanden, den Dateiname param mit Dingen wie ../../../sensitive_uploads/1.jpg zu manipulieren, um zu irgendwo außerhalb Ihres Bildverzeichnisses zu navigieren.

+0

Ich sehe. Wenn ich also richtig verstehe, wenn ich '[^ a]' setzen soll, dann wäre das eine Zeichenklasse für alle Zeichen mit Ausnahme von 'a'? –

+0

Genau. Es gibt weitere Informationen [hier] (https://httpd.apache.org/docs/current/rewrite/intro.html#regex) Siehe negative Charakterklasse. – Phil