2016-04-28 2 views
2

特定の拡張子を持つファイルへのすべての要求を処理する必要のある特定のファイル(このファイルをfile-handlerと呼びます)を私のサーバーに持っています。しかし、file-handler自体には直接アクセスできません。特定のURLを404に書き換えても、同じURLに別の書き換えられたURLでアクセスできるようにするにはどうすればよいですか?

  • 置き、パスワード保護されたディレクトリ内file-handler:私が試した何

    。残念なことに、特定のディレクトリに書き換えられたURLはブラウザ(したがってサーバー)にパスワードを要求するため、この方法は機能しません。

  • file-handlerへの直接アクセスをデフォルトの404ページに書き直します。残念ながら、file-handlerに書き換えられたURLはmod_rewriteによって404ページを提供します。

第二の試みのための出典:最初の404施行規則の

RewriteBase/
RewriteRule dontallowdirectaccess\.xxx$ - [R=404,L] 

#Only serve existing files to the file-handler 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule \.ext$ dontallowdirectaccess.xxx [QSA,L] 

答えて

2

THE_REQUEST変数を使用します。 THE_REQUEST変数は、ブラウザからApacheが受け取った元の要求を表し、の変数とは異なり、変数がREQUEST_URIでないため、上書きされません。

RewriteCond %{THE_REQUEST} /dontallowdirectaccess\.xxx[?\s/] [NC] 
RewriteRule^- [R=404,L] 

#Only serve existing files to the file-handler 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule \.ext$ dontallowdirectaccess.xxx [L] 
+0

私は[?\ s /]部分を削除しましたが、これは機能しているようです。しかし、[?\ s /]部分を文字列の終わりのフラグ($)に置き換えると、それは私のページに役立ちます、なぜですか? –

+0

'$'は入力の終わりを意味するのに対して、この変数の値の例は 'GET /index.php?id=123 HTTP/1.1'なので、URI自体で終わるわけではありません。 – anubhava

+1

これは、物事をクリアする、ありがとう! –

0

だから私は、{THE_REQUEST}変数を解析するためにあなたを必要としないこれを行うための別の方法は、実際に自分であることを考え出しました。

#Only serve existing files to the file-handler (directories not included) 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule (^.+\.ext$) dontallowdirectaccess.xxx?file=$1 [QSA,L] 

#If ENV:REDIRECT_STATUS is empty than someone must be trying to access the file directly. 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule dontallowdirectaccess\.xxx$ - [R=404,L] 
関連する問題