使用.htaccess实现URL重写时遭遇404错误求助
解决.htaccess URL重写404问题
你当前的规则仅完成了旧URL到新URL的外部重定向,但当用户访问新格式的/services/CO/Arvada/时,服务器找不到对应的物理文件,因此返回404错误。需要补充一条内部重写规则,将新URL映射回实际处理请求的state.php文件。
完整的.htaccess规则
RewriteEngine On # 外部重定向:将旧的动态URL跳转到新的静态URL(永久重定向) RewriteCond %{QUERY_STRING} ^state=([A-Za-z]+)&city=([A-Za-z]+)$ RewriteRule ^services/state\.php$ /services/%1/%2/ [R=301,L] # 内部重写:将新的静态URL映射回state.php(不暴露真实文件路径) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^services/([A-Za-z]+)/([A-Za-z]+)/$ /services/state.php?state=$1&city=$2 [L]
规则说明
- 外部重定向规则:匹配
https://example.com/services/state.php?state=CO&city=Arvada这类旧URL,永久重定向到https://example.com/services/CO/Arvada/,结尾的/保证URL格式符合需求,L标记表示执行完这条规则后停止后续处理。 - 内部重写规则:
RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d用于排除真实存在的文件和目录,避免影响services文件夹内其他正常资源。- 匹配
/services/XX/YY/格式的新URL,内部转发到services/state.php?state=XX&city=YY,用户看到的仍是静态URL,但服务器实际用PHP文件处理请求。
注意事项
- 如果state或city参数可能包含数字、连字符,可将正则表达式中的
[A-Za-z]+修改为[A-Za-z0-9-]+。 - 测试阶段建议先用
R=302临时重定向,确认规则生效后再改为R=301永久重定向,防止浏览器缓存错误规则。 - 确保服务器已启用
mod_rewrite模块,且.htaccess文件拥有生效权限。
内容的提问来源于stack exchange,提问作者Sarah B.
相关产品推荐
相关产品推荐

