2016-10-08 4 views
1

私は、URLを介して画像を透かし入れて透かしを入れるスクリプトを使用しています。画像URLパラメータでMod_Rewriteを使用する

たとえば、http://example.com/watermark.php?filename=assets/img/temp/temp_share.jpgの場合、新しい画像に透かしが埋め込まれたtemp_share.jpgとなります。

は私がthis siteで発電機を使用http://example.com/filename/assets/img/temp/temp_share.jpg

のようなものにURLをクリーンアップするためにmod_rewriteを使用しようとしていると、それは私にRewriteRule ^filename/([^/]*)$ /watermark.php?filename=$1 [L]を与えました。

しかし、私はhttp://example.com/filename/assets/img/temp/temp_share.jpgへ行くしようとすると、私は私が間違って何をやったかわからないんだけどNot Found The requested URL /filename/assets/img/temp/temp_share.jpg was not found on this server.

のエラーが発生します。私の.htaccessの

詳しい内容watermark.php

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> 

内容:

$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); 

答えて

2

[^/]ファイル名がやるので/

を除くすべての文字の文字クラスであります/あなたは "filename /"トークンの後にすべての文字をキャプチャする必要があります。これに変更してみてください。トリプル後

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

あなたの書き換えモジュールが有効になっていると、それはまだあなたがログファイルに詳細な書き換えデバッグを有効にすることを検討すべき動作しない場合は、サーバの再起動を行っていることを確認。

イメージパスに余分なセキュリティチェックを追加することも検討する必要があります。誰かが画像ディレクトリのどこかに移動するために、../../../sensitive_uploads/1.jpgのようなものでファイル名パラメータを操作するのは非常に簡単です。

+0

です。だから私が '[^ a]'を入れれば正しく理解すれば 'a'を除くすべての文字の文字クラスになりますか? –

+0

正確に。詳細はこちら[こちら](https://httpd.apache.org/docs/current/rewrite/intro.html#regex)ネガティブキャラクタークラスをご覧ください。 – Phil

関連する問題