如何通过.htaccess重写末尾带点但无扩展名的Apache请求(解决/appcast.指向/appcast.xml的问题)
如何通过.htaccess重写末尾带点但无扩展名的Apache请求(解决/appcast.指向/appcast.xml的问题)
嘿,我来帮你搞定这个.htaccess的重写问题!你的核心需求是把末尾带点的/appcast.请求(或/apps/appcast.)重定向到/appcast.xml,之前的规则没生效主要是几个小细节没处理对,咱们一步步来:
先说说你之前规则的问题
- 第一个规则里的
^/:在.htaccess文件中,RewriteRule的匹配路径是相对于当前目录的,开头不会带斜杠,所以^/根本匹配不到任何请求,这是导致404的主要原因之一。 - 第二个规则里的未转义的点:正则表达式里的
.是匹配任意字符的,你写的"/apps/appcast."会匹配/apps/appcastx、/apps/appcast1这类,而不是严格匹配末尾带点的/apps/appcast.,得把点转义成\.才行。
针对你的场景的解决方案
分两种情况,你可以根据需求选:
情况1:只处理特定的/appcast.(或/apps/appcast.)请求
如果只需要针对这一个特定路径,用这个精准匹配的规则最稳妥:
RewriteEngine On # 如果你是根目录下的/appcast.,用这条 RewriteRule ^appcast\.$ appcast.xml [L,R=301] # 如果是/apps/appcast.,把规则改成这样(.htaccess放在根目录) # RewriteRule ^apps/appcast\.$ apps/appcast.xml [L,R=301]
^appcast\.:严格匹配开头是appcast且末尾是点的路径(\.是转义后的字面点)[L,R=301]:L表示这是最后一条规则,R=301表示永久重定向(让客户端缓存这个跳转关系,避免重复请求错误路径),如果不需要对外暴露跳转(只想内部重写),可以去掉R=301,只保留[L]。
情况2:通用规则——所有末尾带点的请求都转成对应.xml
如果还有其他类似xxx.的请求需要转成xxx.xml,可以用这个通用规则:
RewriteEngine On RewriteRule ^(.+)\.$ $1.xml [L,R=301]
^(.+)\.:捕获点之前的所有字符(比如appcast),$1就是捕获到的内容- 这条规则会把
xxx.自动转成xxx.xml,适合多个类似需求的场景。
额外注意事项
- 确保你的Apache服务器已经启用了
mod_rewrite模块,如果不确定,可以联系主机服务商或者自己检查配置。 .htaccess文件要放在请求路径对应的目录下:比如/apps/appcast.的请求,.htaccess可以放在根目录,或者放在apps目录下(此时规则里不需要写apps/前缀)。
备注:内容来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

