我的服务器上有一个特定的文件(让我们调用此文件为file-handler
),该文件应处理对具有特定扩展名的文件的所有请求。但是file-handler
本身不应该直接访问。
我尝试了什么:
file-handler
放入受密码保护的目录中。不幸的是,任何重写到该特定目录的URL都会导致浏览器(因此服务器)要求输入密码,因此该方法不起作用。file-handler
的直接访问权重写为默认的404页面,不幸的是,任何重写到file-handler
的网址都会导致mod_rewrite为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]
答案 0 :(得分:2)
对于第一个404强制规则,请使用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]
答案 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]