如何解决无效无扩展名请求先301重定向再返回404的问题
解决无扩展名无效请求先301重定向再返回404的问题
你的核心问题是现有规则会无条件给所有无扩展名请求添加.html并301重定向,哪怕目标.html文件根本不存在,导致无效请求先跳转再返回404。要解决这个问题,关键是在重定向之前先检查目标文件是否真实存在,只对存在的页面执行重定向,不存在的直接返回404。
修改后的Rewrite规则
# 仅当对应的.html文件存在时,将/content/go/下的无扩展名请求(含带尾斜杠的)重定向到带.html地址 RewriteCond %{REQUEST_URI} ^/content/go/ RewriteCond %{REQUEST_URI} !\.(html|json|sjson)$ RewriteCond %{REQUEST_FILENAME}.html -f RewriteRule ^(.+?)/?$ $1.html [R=301,L] # 处理.html后缀后带斜杠的无效请求,直接返回404页面 RewriteCond %{REQUEST_URI} ^/content/go/.*\.html/ RewriteRule ^ /content/go/en/error/error-404.html [R=404,L]
关键调整说明
- 合并重复规则:把原来处理带尾斜杠和不带尾斜杠的两个规则合并成一个,用正则
^(.+?)/?$匹配两种情况,简化规则集。 - 添加文件存在检查:
RewriteCond %{REQUEST_FILENAME}.html -f是核心——它会检查当前请求对应的服务器文件路径加上.html后,是否是一个真实存在的文件。只有满足这个条件,才会执行301重定向。 - 过滤已有扩展名的请求:用
!\.(html|json|sjson)$避免对已经带这些扩展名的请求重复处理。
为什么原来的尝试无效?
你之前用的-d是检查路径是否为目录,而你的场景需要检查的是文件是否存在,所以应该用-f(普通文件)这个测试标志,-d自然起不到作用。
这样修改后,当用户请求不存在的页面(比如/content/go/some-non-page)时,因为some-non-page.html不存在,重定向规则不会触发,服务器会直接返回404状态码,不会先跳转到带.html的地址;而对存在的页面,依然会正常301重定向到带.html的版本,保留你需要的SEO友好的重定向逻辑。
内容的提问来源于stack exchange,提问作者Emma Earl Kent
相关产品推荐
相关产品推荐

