CodeIgniter配置.htaccess阻止直接访问上传图片重定向失败报404
禁止直接访问图片资源重定向失败解决方案
原有规则失效原因
你当前的规则出现404主要有两个核心问题:
- 重写目标不符合路由逻辑:你期望重定向到
www.example.com/no-direct-access,但原有规则是做内部重写到index.php/no-direct-access,如果你的PHP应用没有配置pathinfo支持,或者没有对应的路由规则,自然会返回404。 - 正则匹配冗余,没有明确匹配路径前缀,可能出现匹配偏差。
修正后的.htaccess代码
根据你的需求,有两种实现方案可选:
方案1:对外重定向到指定页面(用户地址栏会变)
适合你希望用户明确看到跳转提示页的场景:
RewriteEngine On # 拦截user-uploads目录下的所有直接访问请求 RewriteCond %{REQUEST_URI} ^/assets/images/user-uploads/ [NC] RewriteRule ^ /no-direct-access [R=302,L] # 原有框架路由规则保持不变 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
如果需要永久重定向,把R=302改成R=301即可,修改后记得清浏览器缓存再测试。
方案2:内部重写(用户地址栏不变)
如果/no-direct-access是由你的PHP框架内部路由处理的,不需要对外跳转,可以用这个方案:
RewriteEngine On # 拦截user-uploads目录下的所有直接访问请求 RewriteCond %{REQUEST_URI} ^/assets/images/user-uploads/ [NC] RewriteRule ^ index.php/no-direct-access [L] # 原有框架路由规则保持不变 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
注意:使用这个方案需要确认你的应用已经配置了/no-direct-access对应的路由逻辑,避免依然返回404。
可选优化:允许站内页面引用图片
如果你不需要拦截网站内部页面嵌入的图片,只拦截用户直接在地址栏访问的请求,可以添加Referer校验规则:
RewriteEngine On # 仅拦截非本站来源的user-uploads资源访问请求 RewriteCond %{REQUEST_URI} ^/assets/images/user-uploads/ [NC] RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com/ [NC] RewriteRule ^ /no-direct-access [R=302,L] # 原有框架路由规则保持不变 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
记得把代码中的example.com替换成你自己的实际域名。
内容的提问来源于stack exchange,提问作者Hemendra Sahu
相关产品推荐
相关产品推荐

