URL重写为/language,fr格式后,如何获取语言参数fr?
问题:无法获取URL重写后的language参数值
原本正常的URL是:
http://localhost/test/boutique/index.php?language=fr
但在未配置重写规则的情况下,URL变成了:
http://localhost/test/boutique/index.php/language,fr
这时候切换语言功能直接失效,用isset($_GET['language'])始终返回false,根本拿不到里面的fr值。我当前的代码逻辑如下:
if (!isset($_SESSION['language']) || isset($_GET['language'])) { if (isset($_GET['language']) && !empty($_GET['language']) && $OSCOM_Language->exists($_GET['language'])) { $OSCOM_Language->set($_GET['language']); } $_SESSION['language'] = $OSCOM_Language->get('code'); // default language }
请问该怎么从language,fr里提取出fr这个值?
别担心,这种情况是因为参数没有以标准GET方式传递,而是变成了URL中脚本路径的一部分(也就是PATH_INFO),我们可以通过下面几种方法来提取fr值:
方法一:直接解析$_SERVER['PATH_INFO']
PHP的$_SERVER['PATH_INFO']变量会自动存储URL中脚本文件名之后的路径内容,这里就是/language,fr。我们可以对它做简单分割处理:
$language_code = ''; // 先检查PATH_INFO是否存在且不为空 if (!empty($_SERVER['PATH_INFO'])) { // 去掉开头的斜杠,再按逗号分割字符串 $path_segments = explode(',', ltrim($_SERVER['PATH_INFO'], '/')); // 确保分割后有两个部分,且第一个是我们要的参数名language if (count($path_segments) === 2 && $path_segments[0] === 'language') { $language_code = $path_segments[1]; } } // 接着修改你的原有逻辑,把$_GET['language']替换成$language_code来判断 if (!isset($_SESSION['language']) || !empty($language_code)) { if (!empty($language_code) && $OSCOM_Language->exists($language_code)) { $OSCOM_Language->set($language_code); } $_SESSION['language'] = $OSCOM_Language->get('code'); }
方法二:手动解析整个URL
如果你的环境里$_SERVER['PATH_INFO']不可用,也可以直接解析当前请求的URL:
$language_code = ''; // 获取当前请求的URI部分 $current_uri = $_SERVER['REQUEST_URI']; // 解析URL,提取路径部分 $url_parts = parse_url($current_uri); if (isset($url_parts['path'])) { // 去掉脚本文件的路径,只留下后面的参数部分 $param_part = str_replace('/test/boutique/index.php', '', $url_parts['path']); $param_part = ltrim($param_part, '/'); if (!empty($param_part)) { $path_segments = explode(',', $param_part); if (count($path_segments) === 2 && $path_segments[0] === 'language') { $language_code = $path_segments[1]; } } } // 同样替换原有逻辑中的$_GET判断即可
小提醒
记得要做边界判断,比如检查分割后的数组长度、参数名是否正确,避免异常URL导致程序报错。另外如果后续能配置正确的URL重写规则,还是建议回到使用$_GET的方式,这更符合标准的HTTP参数传递规范。
内容的提问来源于stack exchange,提问作者Zigoto
相关产品推荐
相关产品推荐

