Apache如何通过.htaccess正确访问含?的文件名(替代Nginx try_files)
解决Apache中文件名包含
?的访问问题 嘿,这个场景我之前帮朋友处理过!Apache默认会把URL里的?当成查询字符串的分界符,所以当你访问example.com/news.asp?sec=news&article=24时,它只会去查找服务器上的news.asp文件,完全忽略掉?后面的部分——但你的实际文件名是包含这串内容的,自然会返回404。
要解决这个问题,我们可以通过.htaccess里的重写规则,让Apache把查询字符串拼回文件名里去匹配。具体配置如下:
RewriteEngine On # 当请求的基础文件不存在,且存在查询字符串时,尝试拼接完整文件名 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} .+ RewriteRule ^(.*)$ $1?%{QUERY_STRING} [L]
我来拆解一下这几条规则的作用:
RewriteEngine On:必须开启重写引擎,否则所有规则都不会生效,这是前提。- 第一条
RewriteCond:%{REQUEST_FILENAME}指的是不带查询字符串的请求文件路径(比如/var/example/news.asp),!-f表示这个文件不存在时才触发后续规则。 - 第二条
RewriteCond:%{QUERY_STRING}代表?后面的内容,.+表示这部分不为空,确保我们只处理确实带查询参数的请求。 RewriteRule:把请求的路径($1,也就是news.asp这类部分)和查询字符串(%{QUERY_STRING})拼接成完整的文件名(news.asp?sec=news&article=24),然后让Apache去查找这个文件。[L]标记表示这是最后一条规则,匹配到后就停止处理其他规则了。
这样配置后,当你访问example.com/index.cfm?PageID=30时,Apache就会正确去查找服务器上的index.cfm?PageID=30文件,返回内容并给出200 OK状态。
另外要注意两点:
- 确保你的Apache已经启用了
mod_rewrite模块,大部分主机默认是开启的,如果没开的话,需要联系主机商或者自己在Apache配置里启用它。 - 要保证这些带
?的文件权限正确,Apache进程有读取它们的权限,否则即使规则对了也会报错。
内容的提问来源于stack exchange,提问作者Patrick Kaufmann
相关产品推荐
相关产品推荐

