Rewrite URL后404问题求助:如何移除URL中/files/uploads路径
解决方法
你的问题出在两个地方:一是RewriteBase的设置导致规则匹配逻辑错误,二是重定向后服务器找不到实际文件的存储路径。
问题分析
- 你把
RewriteBase设为/files/uploads/,这会让RewriteRule的匹配路径基于这个目录,所以规则里的^files/uploads/(.*)根本匹配不到任何请求——因为当前上下文已经在/files/uploads/下,请求路径里不会再包含files/uploads前缀。 - 就算重定向成功,新URL
http://example.com/PP/test.pdf会让服务器去根目录寻找PP/test.pdf,但实际文件仍存在于/files/uploads/PP/test.pdf,所以返回404。
正确的Rewrite规则(推荐放在网站根目录的.htaccess中)
# 1. 外部重定向:将旧URL跳转到目标URL(移除/files/uploads/前缀) RewriteRule ^files/uploads/(.*)$ /$1 [NC,L,R=302] # 2. 内部重写:把新URL的请求映射到实际文件路径 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /files/uploads/$1 [L]
规则说明
- 第一条规则:匹配所有以
files/uploads/开头的请求,通过302临时重定向跳转到去掉前缀后的路径,用户地址栏会显示目标URL。测试无误后,可将R=302改为R=301(永久重定向),利于搜索引擎优化。 - 第二条规则:当请求的文件或目录在根目录不存在时,自动将请求转发到
/files/uploads/目录下寻找对应文件,确保新URL能正常访问到原文件。
可选:若规则需放在/files/uploads/目录的.htaccess中
RewriteBase /files/uploads/ # 重定向当前目录下的所有请求到根目录对应路径 RewriteRule ^(.*)$ /$1 [NC,L,R=302]
同时必须在网站根目录的.htaccess中添加内部重写规则,否则新URL仍会返回404:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /files/uploads/$1 [L]
内容的提问来源于stack exchange,提问作者SirSeba
相关产品推荐
相关产品推荐

