.htaccess规则配置:特定路径URL转发并隐藏目标域名
解决.htaccess反向代理隐藏S3域名问题
正确配置代码
RewriteEngine On # 匹配带/Criteria1/valueaddedcourse/前缀的请求,捕获后面的文件名 RewriteCond %{REQUEST_URI} ^/Criteria1/valueaddedcourse/(.*)$ # 后台代理到S3,地址栏保留原域名 RewriteRule ^Criteria1/valueaddedcourse/(.*)$ https://qaanr.s3-ap-south-1.amazonaws.com/$1 [L,P]
原配置的问题所在
你之前的代码用%{REQUEST_FILENAME}踩了坑——这个变量指向的是服务器本地的文件绝对路径,不是URL里的文件名。比如原请求是/Criteria1/valueaddedcourse/2202223742-first aid course.pdf,%{REQUEST_FILENAME}会变成类似/var/www/html/Criteria1/valueaddedcourse/2202223742-first aid course.pdf的本地路径,拼到S3域名后逻辑错误,虽能转发但存在隐患。另外,RewriteRule ^(.*)匹配范围过宽,容易误处理其他无关请求。
逐行配置详解(新手友好)
RewriteEngine On:开启Apache的URL重写功能,这是所有重写规则生效的前提,没有这行后面的规则都不会执行。RewriteCond %{REQUEST_URI} ^/Criteria1/valueaddedcourse/(.*)$:%{REQUEST_URI}:Apache内置变量,代表用户当前访问的路径(比如/Criteria1/valueaddedcourse/2202223742-first aid course.pdf)。- 正则表达式
^/Criteria1/valueaddedcourse/(.*)$:精准匹配以/Criteria1/valueaddedcourse/开头的请求,(.*)会捕获该路径后面的所有内容(也就是文件名),并存储为变量$1。
RewriteRule ^Criteria1/valueaddedcourse/(.*)$ https://qaanr.s3-ap-south-1.amazonaws.com/$1 [L,P]:- 前面的正则匹配要处理的请求路径,再次捕获文件名到
$1。 - 后面的目标地址将捕获到的
$1(文件名)拼接在S3域名后,生成正确的资源访问路径。 [L,P]是核心标记:L表示这是最后一条规则,匹配后不再处理后续规则;P代表启用反向代理——服务器会在后台请求S3资源,再返回给用户,浏览器地址栏始终显示原域名,不会暴露S3地址。
- 前面的正则匹配要处理的请求路径,再次捕获文件名到
必须检查的关键事项
- 确保Apache服务器已启用
mod_rewrite、mod_proxy、mod_proxy_http三个模块,这是反向代理的基础。以Ubuntu/Debian为例,可通过命令a2enmod rewrite proxy proxy_http启用,之后重启Apache服务。 - S3桶需配置允许原域名的访问权限:要么设置CORS规则允许原域名跨域请求,要么将对应资源设为公开可读,否则代理请求会返回403禁止访问错误。
.htaccess文件需放在原域名的根目录下,且服务器配置中需开启AllowOverride All,否则.htaccess内的规则无法生效。
内容的提问来源于stack exchange,提问作者TwoT Technologies
相关产品推荐
相关产品推荐

