通过.htaccess重写$_GET参数遇500错误求助
解决.htaccess重写URL导致500错误的问题
你的500错误大概率是因为HTTPS跳转规则不完整,再加上可能存在的重写冲突风险,咱们一步步来排查解决:
第一步:补全HTTPS跳转规则
你提供的HTTPS跳转规则没写完,这本身就会导致服务器解析失败,先把它补全:
RewriteEngine On # 强制跳转至HTTPS RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
第二步:添加防冲突的URL重写规则
你的原重写逻辑没问题,但如果服务器上存在system实际目录,mod_dir的默认行为可能会和重写规则冲突,建议加上排除实际文件/目录的条件:
# 重写system/xxx到system.php?id=xxx RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^system/(.*)$ /system.php?id=$1 [NC,L]
这两个条件的作用:
%{REQUEST_FILENAME} !-f:跳过对实际存在文件的请求%{REQUEST_FILENAME} !-d:跳过对实际存在目录的请求
能有效避免不必要的重写循环或冲突。
第三步:确保Apache允许.htaccess生效
如果调整规则后还是报错,要检查Apache虚拟主机配置,确认/var/www/目录开启了AllowOverride All,否则.htaccess的规则不会被执行:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
修改后记得重启Apache服务:sudo systemctl restart apache2
第四步:完整的.htaccess示例
把以下内容放在/var/www/根目录的.htaccess里:
RewriteEngine On # 强制HTTPS跳转 RewriteCond %{HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # URL重写规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^system/(.*)$ /system.php?id=$1 [NC,L]
现在访问mydomain.com/system/748742就能正常映射到system.php?id=748742,同时会自动跳转到HTTPS。
如果你的system.php不在根目录(比如在子文件夹中),记得调整重写规则里的目标路径,比如文件在/var/www/public/system.php,规则要改成/public/system.php?id=$1。
内容的提问来源于stack exchange,提问作者Amazing man
相关产品推荐
相关产品推荐

