如何将特定URL重写为404但允许通过另一个重写的URL访问同一个URL?

时间:2016-04-28 19:38:33

标签: .htaccess mod-rewrite

我的服务器上有一个特定的文件(让我们调用此文件为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]

2 个答案:

答案 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]