如何将动态URL转为静态链接,并用PHP、MySQLI及.htaccess实现
动态链接转静态链接及500错误解决方案
一、.htaccess重写规则配置
要实现example.com/company/famoustech到example.com/company.php?company=famoustech的隐式跳转,需在网站根目录创建/修改.htaccess文件,添加以下规则:
RewriteEngine On # 排除真实存在的文件和目录,避免干扰正常访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将/company/xxx格式的请求重写到company.php并传递company参数 RewriteRule ^company/([^/]+)$ /company.php?company=$1 [L,QSA]
说明:
[L]表示这是最后一条匹配规则,QSA用于保留额外的查询参数(如果有的话)。
二、PHP页面(company.php)代码调整
之前的500错误大概率是重写规则未生效导致参数无法获取,或代码未做容错处理。以下是修正后的安全代码:
// 安全获取并过滤参数 $company_name = isset($_GET['company']) ? trim($_GET['company']) : ''; // 空参数直接返回404 if (empty($company_name)) { header("HTTP/1.1 404 Not Found"); echo "无效的公司名称"; exit; } // 初始化MySQLi连接(替换为你的数据库信息) $conn = new mysqli('localhost', '数据库用户名', '数据库密码', '数据库名'); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 使用预处理语句防止SQL注入 $stmt = $conn->prepare("SELECT * FROM 你的表名 WHERE company_name = ?"); $stmt->bind_param("s", $company_name); $stmt->execute(); $result = $stmt->get_result(); // 无匹配结果返回404 if ($result->num_rows === 0) { header("HTTP/1.1 404 Not Found"); echo "未找到该公司信息"; exit; } // 获取公司数据并输出 $company_data = $result->fetch_assoc(); echo "公司名称:" . htmlspecialchars($company_data['company_name']); // 关闭资源 $stmt->close(); $conn->close();
三、首页链接生成优化
你当前的链接写法没问题,但需添加XSS防护:
<a href="/company/<?= htmlspecialchars($row['company'])?>"><?= htmlspecialchars($row['company'])?></a>
四、500错误排查步骤
- 检查.htaccess语法:清空文件后仅保留重写规则测试,避免语法错误导致服务器报错。
- 确认mod_rewrite启用:Apache服务器需开启
mod_rewrite模块,且虚拟主机配置中需设置AllowOverride All(否则.htaccess规则不生效)。 - 查看服务器错误日志:500错误的具体原因会记录在服务器的
error_log文件中,可通过日志定位代码或配置问题。 - 直接测试PHP页面:访问
example.com/company.php?company=famoustech,若仍报错,说明PHP代码本身存在问题(如数据库连接错误、语法错误)。
内容的提问来源于stack exchange,提问作者Famoustech
相关产品推荐
相关产品推荐

