强制重定向某些文件(基于引用),否则触发404页面

时间:2013-04-22 15:17:30

标签: .htaccess mod-rewrite redirect

我们通过单个下载链接分发不同版本的软件产品。传递基于referer和默认值,工作正常。此外,如果使用了错误的文件名,用户应该被重定向到404页面。

目前.htaccess - 文件如下所示:

# stop directory listing
Options -Indexes

# turn rewrite engine on
RewriteEngine On

# force 404 if file name is missing or wrong
RewriteCond %{REQUEST_URI} !^(download_mac\.zip|download_pc\.zip)$
RewriteRule (.*) 404/index.html [L]

# an example based on the referer
RewriteCond %{HTTP_REFERER} ^http://([^.]+\.)*domain-a\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^.]+\.)*domain-b\.com
RewriteRule ^(download_mac\.zip|download_pc\.zip)$ domain_ab/$1 [L]

# last rule if no referer matches
RewriteRule ^(download_mac\.zip|download_pc\.zip)$ default/$1 [L]

所以我对这个文件有一个问题和一个额外的问题:

  1. 强制404的第一条规则非常贪婪,无论调用什么URL,都会在每个时间获取错误页。我也试过像RewriteCond %{REQUEST_URI} !^download_mac\.zip$这样的单一语句而没有任何效果。我该如何解决这个问题?
  2. 如何摆脱任何其他规则中的文件名?我尝试了RewriteRule ^(.*)$ default/$1 [L]之类的内容,但它给了我一个艰难的时间和500 Internal Server Error

2 个答案:

答案 0 :(得分:1)

您可以使用如下的Env变量来避免重复文件名:

RewriteRule ^(download_mac\.zip|download_pc\.zip)$ - [E=ALLOWED:$1,NC]

RewriteCond %{ENV:ALLOWED} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /404/index.html [L]

RewriteCond %{ENV:ALLOWED} !^$
RewriteCond %{HTTP_REFERER} ^http://([^.]+\.)*domain-a\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^.]+\.)*domain-b\.com
RewriteRule ^ /domain_ab/%{ENV:ALLOWED} [L]

RewriteCond %{ENV:ALLOWED} !^$
RewriteRule ^ /default/%{ENV:ALLOWED} [L]

答案 1 :(得分:1)

您可以将重写规则移至最后。其他规则处理有效案例,如果它们都不匹配,则适用最后一条规则

# an example based on the referer
RewriteCond %{HTTP_REFERER} ^http://([^.]+\.)*domain-[ab]\.com
RewriteRule ^download_(mac|pc)\.zip$ domain_ab/$0 [L]

# last rule if no referer matches
RewriteRule ^download_(mac|pc)\.zip$ default/$0 [L]

# force 404 if file name is missing or wrong
RewriteRule ^ 404/index.html [L]