将PHP网站升级为HTTPS后出现404错误,求排查解决
问题排查与解决方案
核心问题分析
访问根目录重定向到/en后触发404,本质是.htaccess的URL重写规则未正确匹配/en路径,导致服务器将其当作真实文件/目录查找,最终触发自定义404页面。直接访问index.php?lang=en正常,说明PHP运行正常,问题集中在重写规则和域名配置上。
具体排查与修复步骤
1. 添加RewriteBase并优化规则优先级
在.htaccess的RewriteEngine On后添加RewriteBase /,确保重写路径以网站根目录为基准。同时将强制HTTPS/统一域名的规则放在最前面,避免路由规则被拦截:
Options All -Indexes Options +FollowSymLinks RewriteEngine On RewriteBase / # 强制跳转至HTTPS + 统一www域名 RewriteCond %{HTTPS} off RewriteRule ^ https://www.mywebsite.com%{REQUEST_URI} [L,R=301] RewriteCond %{HTTP_HOST} !^www\.mywebsite\.com$ [NC] RewriteRule ^ https://www.mywebsite.com%{REQUEST_URI} [L,R=301]
2. 修正重写规则的匹配条件
原规则仅排除了真实文件,未排除真实目录。如果服务器上存在en目录,会优先访问目录而非触发重写。给所有路由规则统一添加排除文件和目录的条件:
# 排除真实文件/目录,仅对不存在的路径执行重写 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 路由规则,添加[L]终止后续规则,[QSA]保留原有参数 RewriteRule ^([a-zA-Z0-9_-]+)/?$ index.php?lang=$1 [L,QSA] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?lang=$1&menu=$2 [L,QSA] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9ÑñÇçÜüÁáÉéÍíÓóÚú=_-]+)/?$ index.php?lang=$1&menu=$2&page=$3 [L,QSA] RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)/([a-zA-Z0-9ÑñÇçÜüÁáÉéÍíÓóÚú=_-]+)/([a-zA-Z0-9_-]+)/?$ index.php?lang=$1&menu=$2&page=$3&key=$4 [L,QSA] ErrorDocument 404 /pages/404-page-htaccess.php
3. 优化PHP重定向代码
使用header()重定向更规范,且必须在输出任何内容前调用,重定向后需终止脚本执行:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>My title</title> <meta name="description" content="My description."/> <meta name="google-site-verification" content="XXXXX"/> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> <meta name="keywords" content="keyword1, keyword2, keyword3"> </head> <body> <?php if (isset($_GET['lang']) && $_GET['lang'] !== '') { echo "GET: " . $_GET['lang']; // 输出实际lang值方便测试 } else { header("Location: https://www.mywebsite.com/en", true, 302); exit(); // 重定向后必须终止脚本 } ?> </body> </html>
4. 检查服务器配置
确保Apache虚拟主机配置中开启了AllowOverride All,否则.htaccess的重写规则无法生效:
<Directory /path/to/your/website> AllowOverride All Require all granted </Directory>
测试验证
完成上述修改后,访问https://mywebsite.com会自动重定向到https://www.mywebsite.com/en,此时页面应显示GET: en,而非404内容。
内容的提问来源于stack exchange,提问作者forvas
相关产品推荐
相关产品推荐

