未指定文件或文件丢失时内部服务器错误

时间:2015-10-16 11:42:04

标签: apache .htaccess mod-rewrite redirect url-rewriting

我正在使用此重写规则:

let version1 = "1.2.4"
let version2 = "2.3.6"

let result = version1.compare(version2, options: .numeric)
switch result {
case .orderedSame : print("versions are equal")
case .orderedAscending : print("version1 is less than version2")
case .orderedDescending : print("version1 is greater than version2")
}

这样做,当我使用f.e RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{HTTP_HOST} ^img.domain.com [NC] RewriteRule ^(.*)$ data/photos/$1 [L] 时,它将显示文件http://img.domain.com/profile_image.jpg的内容而不更改url(蒙板)。没关系。

问题是,万一有人进入http://www.domain.com/data/photos/profile_image.jpg,它将返回500内部服务器错误,但我希望它显示403 Forbidden,与您输入http://img.domain.com时相同。我很无奈,如何修改这个重写规则来实现这个目标?

编辑:

同样的问题是当文件在http://www.domain.com/data/photos/中不存在时,我想返回404 ...但它返回500.

在错误日志中有太多的递归......

1 个答案:

答案 0 :(得分:2)

首先应检查目标文件是否存在,然后重写它:

# 403 for img subdomain when request is for landing page
RewriteCond %{HTTP_HOST} ^img\.domain\.com$ [NC]
RewriteRule ^(data/photos)?/?$ - [F,NC]

RewriteCond %{HTTP_HOST} ^img\.domain\.com$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/data/photos/$1 -f
RewriteRule ^(.+)$ data/photos/$1 [L]