基于Session变量的.htaccess URL重写及伪静态实现需求
解决方案
一、Apache .htaccess 配置
将以下规则放置在网站根目录的.htaccess文件中,实现动态路由与伪静态效果:
# 开启重写引擎 RewriteEngine On # 1. 处理首次访问:无CLIENT_NAME会话时,内部转发至index.php初始化 # 匹配 /CLIENT_NAME/ 或 /CLIENT_NAME 请求,且Cookie中无CLIENT_NAME标识 RewriteCond %{HTTP_COOKIE} !CLIENT_NAME=([^;]+) [NC] RewriteRule ^([^/]+)/?$ /index.php?id=$1 [L,QSA] # 2. 会话已初始化:将 /CLIENT_NAME/page 映射到 page.php,隐藏.php后缀 # 匹配 /CLIENT_NAME/xxx 格式请求,且Cookie中存在CLIENT_NAME标识 RewriteCond %{HTTP_COOKIE} CLIENT_NAME=([^;]+) [NC] RewriteRule ^[^/]+/([^/]+)$ /$1.php [L,QSA] # 3. 默认首页:会话存在时,/CLIENT_NAME/ 直接映射到index.php RewriteCond %{HTTP_COOKIE} CLIENT_NAME=([^;]+) [NC] RewriteRule ^[^/]+/?$ /index.php [L,QSA]
二、PHP 会话处理逻辑
在根目录的index.php中添加以下代码,完成客户会话的初始化与校验:
<?php session_start(); // 处理首次访问的id参数,初始化客户会话 if (isset($_GET['id']) && !isset($_SESSION['CLIENT_NAME'])) { $clientName = trim($_GET['id']); // 可在此添加客户名称合法性校验逻辑(如数据库查询验证) if (!empty($clientName)) { $_SESSION['CLIENT_NAME'] = $clientName; // 设置Cookie,让Apache重写规则识别会话状态(有效期可按需调整) setcookie('CLIENT_NAME', $clientName, time() + 86400 * 30, '/', 'test.com', true, true); } } // 后续业务逻辑代码... ?>
关键说明
- Apache无法直接读取PHP Session,因此通过同步设置Cookie让重写规则识别会话状态,这是实现动态路由的核心。
- 正则
[^/]+用于匹配不含斜杠的合法客户名称,若有特殊字符限制,可调整正则规则。 QSA标记会保留URL中的额外查询参数,避免参数丢失。- 所有需要使用会话的PHP文件,开头需调用
session_start()确保会话正常生效。
内容的提问来源于stack exchange,提问作者Gregsta
相关产品推荐
相关产品推荐

