使用.htaccess替换URL中的问号为%3F以解决404问题
解决文件路径含问号的URL 404问题
你的问题核心是:Apache会把URL里的?默认当作请求路径和查询字符串的分隔符,所以当你访问https://www.example.com/uploads/10015015?afe/filename.doc时,服务器实际找的是路径/uploads/10015015,并把afe/filename.doc当成查询字符串,但你的真实文件路径是包含?(即URL编码后的%3F)的/uploads/10015015?afe/filename.doc,所以会返回404。
你现有的.htaccess规则有两个关键错误:
RewriteCond %{QUERY_STRING} ^?afe([^&]*)里的^?是多余的——Apache的%{QUERY_STRING}变量只包含?后面的内容,不包含?本身,所以条件永远匹配不上。- 没有限定匹配的路径前缀,可能会误匹配其他无关请求。
修正后的.htaccess规则
RewriteEngine On # 匹配/uploads/开头的数字路径,且查询字符串以afe/开头 RewriteCond %{QUERY_STRING} ^afe/ RewriteRule ^uploads/(\d+)$ /uploads/$1%3F%{QUERY_STRING}? [L,R=301]
规则说明
RewriteCond %{QUERY_STRING} ^afe/:匹配查询字符串以afe/开头的请求(也就是原URL里?后面的部分)。RewriteRule ^uploads/(\d+)$:匹配请求路径为/uploads/加一串数字的格式(对应你说的动态数字部分)。/uploads/$1%3F%{QUERY_STRING}?:重写后的路径是原数字部分加上URL编码的?(即%3F),再拼接原查询字符串;结尾的?是用来清空查询字符串,避免重写后的URL再次带上?xxx。R=301:添加永久重定向,告诉浏览器更新书签和缓存,不需要的话可以改成R=302临时重定向,或者去掉R=xx只做内部重写(如果不想让用户看到URL变化)。
如果你的数字部分后面可能有其他字符(不只是纯数字),可以把(\d+)改成([^?]+),匹配/uploads/后面到?之前的所有字符。
内容的提问来源于stack exchange,提问作者lccv
相关产品推荐
相关产品推荐

