使用.htaccess为特定slug配置Wildcard 404重定向出错求助
问题分析与解决
你的规则之所以会把所有/decks/后带文本的链接(即使是有效页面)都重定向,核心原因是:
- 你用了
%{REQUEST_FILENAME} !-f和%{REQUEST_FILENAME} !-d这两个条件,它们只检查物理文件或目录是否存在。 - 如果/decks/下的有效页面是动态生成的(比如通过框架路由、PHP脚本处理,没有对应的物理文件/目录),这两个条件会判定为“真”,规则就会触发,把这些有效页面也当成不存在的URL重定向了。
解决方案
方案一:用PHP处理404跳转(适合动态站点)
这种方法能精准捕获真正的404请求,不会误判动态有效页面:
- 在.htaccess中添加404错误处理规则:
ErrorDocument 404 /404-handler.php
- 创建
404-handler.php文件,写入以下代码:
<?php $requestUri = $_SERVER['REQUEST_URI']; // 判断请求是否以/decks/开头,且不是/decks/本身 if (strpos($requestUri, '/decks/') === 0 && $requestUri !== '/decks/') { header("Location: /decks/", true, 302); exit; } // 下面是常规404页面的内容 http_response_code(404); ?> <!DOCTYPE html> <html> <head> <title>404 Not Found</title> </head> <body> <h1>404 Not Found</h1> <p>The requested URL was not found on this server.</p> </body> </html>
方案二:添加有效路径例外(适合静态/少量动态页面)
如果/decks/下的有效页面数量不多,可以直接在规则里排除它们,避免被误定向:
# Custom Redirects for /decks/ 404s <IfModule mod_rewrite.c> RewriteEngine On # 逐一排除已知的有效/decks/子页面 RewriteCond %{REQUEST_URI} !^/decks/valid-page1$ [NC] RewriteCond %{REQUEST_URI} !^/decks/valid-page2$ [NC] # 原有的条件 RewriteCond %{REQUEST_URI} ^/decks/ [NC] RewriteCond %{REQUEST_URI} !^/decks/$ [NC] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^decks/ /decks/ [L,R=302] </IfModule>
注意:每次新增/decks/下的有效页面,都需要在这里添加对应的排除规则。
内容的提问来源于stack exchange,提问作者Jake Henderson
相关产品推荐
相关产品推荐

