WordPress站点通过.htaccess为指定URL设置404状态码的问题求助
WordPress站点通过.htaccess为指定URL设置404状态码的问题求助
问题描述
我想在WordPress网站的.htaccess中为特定URL设置404 HTTP状态码,目标URL是https://www.infocera.com/oppo-find,但希望它的带.html后缀版本https://www.infocera.com/oppo-find.html能正常访问。
我尝试过一些规则,但目前遇到的问题是:访问/oppo-find时会先被301重定向到/oppo-find.html,然后这个带后缀的页面也返回404了,这不是我想要的结果。
以下是我当前的.htaccess完整代码:
RewriteEngine On # ensure www and https RewriteCond %{HTTP_HOST} !^www.infocera.com$ [NC] RewriteRule ^(.*)$ https://www.infocera.com/$1 [L,R=301] # ensure https RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 404 status code for category slugs RewriteEngine On RewriteCond %{REQUEST_URI} ^/oppo-find/?$ RewriteRule ^ - [R=404,L] RewriteEngine On RewriteCond %{REQUEST_URI} ^/garmin-forerunner/?$ RewriteRule ^ - [R=404,L] #RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{QUERY_STRING} ^m=[01]$ [NC] RewriteRule ^(.*)$ /$1? [L,NC,R=404] #RewriteRule ^(.*)$ https://www.infocera.com/$1 [L,R=301] RewriteRule ^(images/[^.]+)\.jpg$ /$1.webp [R=301,L,NC]
解决方案
你的问题主要出在规则顺序不当和没有避开WordPress的默认重定向行为——WordPress会自动把无后缀的请求重定向到对应带.html的页面(如果页面存在)。要实现目标,我们需要调整规则的位置和写法,具体如下:
1. 清理冗余配置
整个.htaccess文件只需要开头声明一次RewriteEngine On即可,重复声明不仅没用还可能引发冲突,先把这些重复的删掉。
2. 调整规则顺序
正确的规则顺序应该是:
- 先执行WWW/HTTPS的强制跳转(标准化请求)
- 然后执行你的自定义规则(404、图片重定向等)
- 最后保留WordPress默认的重写规则(这部分是WordPress页面路由的核心,必须放在最后)
3. 精确匹配目标URL
修改404规则的写法,确保只命中无后缀的/oppo-find(含可选的尾部斜杠),不会影响带.html的版本。
以下是调整后的完整.htaccess代码:
RewriteEngine On # 强制跳转至www和HTTPS RewriteCond %{HTTP_HOST} !^www.infocera.com$ [NC] RewriteRule ^(.*)$ https://www.infocera.com/$1 [L,R=301] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 为指定URL设置404(必须放在WordPress规则之前) # 匹配/oppo-find 或 /oppo-find/,直接返回404 RewriteRule ^oppo-find/?$ - [R=404,L] # 匹配/garmin-forerunner 或 /garmin-forerunner/,直接返回404 RewriteRule ^garmin-forerunner/?$ - [R=404,L] # 处理带m参数的请求返回404 RewriteCond %{QUERY_STRING} ^m=[01]$ [NC] RewriteRule ^(.*)$ /$1? [L,NC,R=404] # 将.jpg图片重定向为.webp RewriteRule ^(images/[^.]+)\.jpg$ /$1.webp [R=301,L,NC] # BEGIN WordPress # 注意:这部分是WordPress自动生成的规则,务必保留在最后 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
关键说明
- 为什么要调整顺序?
把404规则放在WordPress规则之前,当请求/oppo-find时,会先被这个规则拦截并直接返回404,不会触发WordPress自动重定向到/oppo-find.html的行为。 - 精确匹配的作用
RewriteRule ^oppo-find/?$ - [R=404,L]中的^和$是锚定符,确保只匹配完整的/oppo-find路径,/?允许请求末尾带或不带斜杠,完全不会影响/oppo-find.html的正常访问。
备注:内容来源于stack exchange,提问作者Jai
相关产品推荐
相关产品推荐

