htaccess配置RewriteRule规则访问services/page路径触发404错误求助
问题根源
你的404错误是重写规则顺序错误+规则无结束符导致误匹配造成的:
- 现有规则顺序是模糊规则在前、精确规则在后:
services/page/数字的规则放在了^services/([a-zA-Z0-9-]+)(服务详情页规则)和^services(服务列表页规则)之后,访问services/page/1时会优先匹配到前面的服务详情页规则,将page当作服务slug参数,触发[L]标记直接终止后续规则执行,根本不会走到分页规则 - 原服务列表页规则
RewriteRule ^services services.php没有加路径结束符$,只要路径开头包含services就会被匹配,也会干扰分页路径的解析 - 原分页规则的正则
[\d]仅能匹配单个数字,无法支持2位及以上的页码
解决方案
调整规则顺序,将更精确的规则放在前面,同时给规则补充必要的结束符、修正页码正则:
完整修改后的.htaccess代码如下:
RewriteEngine On <IfModule mod_rewrite.c> RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.elancemart\.com [NC] RewriteRule (.*) https://elancemart.com/$1 [L,R=301] </IfModule> # 最精确的规则放最前面:services分页规则 RewriteRule ^services/page/(\d+)$ /services.php?page=$1 [NC,L,QSA] # 服务详情页规则 RewriteRule ^services/([a-zA-Z0-9-]+)$ service_details.php?slug=$1 [NC,L] # 服务列表页规则,加$限定仅匹配/services或/services/ RewriteRule ^services/?$ services.php [NC,L] # 其他自定义规则 RewriteRule ^category/([a-zA-Z-]+)$ category.php?catSlug=$1 [NC,L] RewriteRule ^blog/([0-9]+)/([a-zA-Z0-9-]+)$ blog/article.php?id=$1&slug=$2 [NC,L] RewriteRule ^verify/([a-zA-Z0-9-]+)$ verify.php?verify=$1 [NC,L] RewriteRule ^funds/?$ add-funds.php [NC,L] RewriteRule ^sitemap\.xml/?$ sitemap.php RewriteRule ^article-sitemap\.xml/?$ article-sitemap.php # 自动加.php后缀的规则放在自定义规则之后 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L] ErrorDocument 404 /index.php
补充说明
所有自定义伪静态规则都建议加上路径结束符$,避免短路径规则误匹配更长的路径,同时将自动加后缀的通用规则放在所有自定义规则之后,避免通用规则提前拦截自定义路径。
内容的提问来源于stack exchange,提问作者Diwakar Kumar
相关产品推荐
相关产品推荐

