当前位置: 首页 > news >正文

PHP 伪静态详解及实现方法

概述

在现代 Web 开发中,URL 的设计对用户体验和搜索引擎优化(SEO)至关重要。动态 URL 虽然功能强大,但往往显得冗长且不友好。伪静态(URL 重写)技术通过将动态 URL 转换为静态样式,不仅提高了用户体验,也增强了搜索引擎的抓取效率。本文将详细介绍什么是伪静态,以及如何在 PHP 中实现伪静态。

什么是伪静态

伪静态又名 URL 重写,是将动态的网址(如 abc.php?lang=cn&class=1&id=2)通过重写技术转换为静态样式的网址(如 abc-cn-class1-id2.html)。实际上,这些静态样式的网址在服务器上并不存在,而是通过服务器配置和脚本处理来实现的。

动态、静态、伪静态之间的利与弊
动态网址
  • 优点
    • 动态网址能够告诉搜索引擎更多的参数信息,有助于内容的识别和处理。
    • 参数可以灵活变化,适应不同的请求。
  • 缺点
    • 过长的 URL 可能会影响用户体验和 SEO。
    • 大量相同的参数可能会导致重复页面,影响搜索引擎的抓取效率。
静态网址
  • 优点
    • 清晰明了,易于理解和记忆。
    • 对搜索引擎友好,提高点击率。
  • 缺点
    • 静态文件生成和更新较为耗时,尤其是在内容频繁变化的情况下。
    • 静态文件占用硬盘空间,可能影响服务器性能。
伪静态网址
  • 优点
    • 结合了动态和静态的优点,既保持了动态 URL 的灵活性,又具有静态 URL 的友好性。
    • 不需要生成大量的静态文件,节省硬盘空间。
  • 缺点
    • 伪静态依赖于服务器配置和脚本处理,增加了服务器的 CPU 负载。
    • 如果配置不当,可能会导致重复页面,影响 SEO。
PHP 伪静态实现方法
方法一:手动解析 URL
<?php
// 伪静态方法一// localhost/php100/test.php?id|1@action|2
$Php2Html_FileUrl = $_SERVER["REQUEST_URI"];
echo $Php2Html_FileUrl . "<br>"; // /php100/test.php?id|1@action|2$Php2Html_UrlString = str_replace("?", "", str_replace("/", "", strrchr(strrchr($Php2Html_FileUrl, "/"), "?")));
echo $Php2Html_UrlString . "<br>"; // id|1@action|2$Php2Html_UrlQueryStrList = explode("@", $Php2Html_UrlString);
print_r($Php2Html_UrlQueryStrList); // Array ( [0] => id|1 [1] => action|2 )
echo "<br>";foreach ($Php2Html_UrlQueryStrList as $Php2Html_UrlQueryStr) {$Php2Html_TmpArray = explode("|", $Php2Html_UrlQueryStr);print_r($Php2Html_TmpArray); // Array ( [0] => id [1] => 1 ) ; Array ( [0] => action [1] => 2 )echo "<br>";$_GET[$Php2Html_TmpArray[0]] = $Php2Html_TmpArray[1];
}//echo '假静态:$_GET变量<br />';
print_r($_GET); // Array ( [id|1@action|2] => [id] => 1 [action] => 2 )
echo "<br>";
echo "<hr>";
echo $_GET['id'] . "<br>"; // 1
echo $_GET['action']; // 2
?>
方法二:基于路径解析
<?php
// 伪静态方法二// localhost/php100/test.php/1/2
$filename = basename($_SERVER['SCRIPT_NAME']);
echo $_SERVER['SCRIPT_NAME'] . "<br>"; // /php100/test.php
echo $filename . "<br>"; // test.phpif (strtolower($filename) == 'test.php') {if (!empty($_GET['id'])) {$id = intval($_GET['id']);echo $id . "<br>";$action = intval($_GET['action']);echo $action . "<br>";} else {$nav = $_SERVER['REQUEST_URI'];echo "1:" . $nav . "<br>"; // /php100/test.php/1/2$script = $_SERVER['SCRIPT_NAME'];echo "2:" . $script . "<br>"; // /php100/test.php$nav = ereg_replace("^$script", "", urldecode($nav));echo $nav . "<br>"; // /1/2$vars = explode("/", $nav);print_r($vars); // Array ( [0] => [1] => 1 [2] => 2 )echo "<br>";$id = intval($vars[1]);$action = intval($vars[2]);}echo $id . '&' . $action;
}
?>
方法三:使用正则表达式
<?php
// 伪静态方法三function mod_rewrite() {global $_GET;$nav = $_SERVER["REQUEST_URI"];echo $nav . "<br>";$script_name = $_SERVER["SCRIPT_NAME"];echo $script_name . "<br>";$nav = substr(ereg_replace("^$script_name", "", urldecode($nav)), 1);echo $nav . "<br>";$nav = preg_replace("/^.ht(m){1}(l){0,1}$/", "", $nav); // 这句是去掉尾部的.html或.htmecho $nav . "<br>";$vars = explode("/", $nav);print_r($vars);echo "<br>";for ($i = 0; $i < count($vars); $i += 2) {$_GET["$vars[$i]"] = $vars[$i + 1];}return $_GET;
}mod_rewrite();
$year = $_GET["year"]; // 结果为'2006'
echo $year . "<br>";
$action = $_GET["action"]; // 结果为'_add'
echo $action;
?>
方法四:利用 PATH_INFO
<?php
// 伪静态方法四// 利用 server 变量 取得 PATH_INFO 信息 该例中为 /1,100,8630.html 也就是执行脚本名后面的部分
if (@$path_info = $_SERVER["PATH_INFO"]) {// 正则匹配一下参数if (preg_match("/\/(\d+),(\d+),(\d+)\.html/si", $path_info, $arr_path)) {$gid = intval($arr_path[1]); // 取得值 1$sid = intval($arr_path[2]); // 取得值 100$softid = intval($arr_path[3]); // 取得值 8630} else {die("Path:Error!");}// 相当于 soft.php?gid=1&sid=100&softid=8630
} else {die('Path:Nothing!');
}
?>
使用 Apache 进行 URL 重写
1. 检测 Apache 是否支持 mod_rewrite

通过 PHP 提供的 phpinfo() 函数查看环境配置,通过 Ctrl+F 查找到“Loaded Modules”,其中列出了所有 Apache2Handler 已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置。

如果没有开启“mod_rewrite”,则打开目录 您的 Apache 安装目录 /apache/conf/ 下的 httpd.conf 文件,通过 Ctrl+F 查找到“LoadModule rewrite_module”,将前面的“#”号删除即可。

如果没有查找到,则到“LoadModule” 区域,在最后一行加入 LoadModule rewrite_module modules/mod_rewrite.so(必选独占一行),然后重启 Apache 服务器即可。

2. 让 Apache 服务器支持 .htaccess

如何让自己的本地 Apache 服务器支持 .htaccess 呢?其实只要简单修改一下 Apache 的 httpd.conf 设置就可以让 Apache 支持 .htaccess

打开 httpd.conf 文件(在哪里?Apache 目录的 CONF 目录里面),用文本编辑器打开后,查找:

<Directory />Options FollowSymLinksAllowOverride None
</Directory>

改为:

<Directory />Options FollowSymLinksAllowOverride All
</Directory>

就可以了。

3. 建立 .htaccess 文件

如果是在 Windows 平台下,刚开始还真不知道怎么建立 .htaccess 文件,因为这个文件实际上没有文件名,仅仅只有扩展名,通过普通方式是无法建立这个文件的,别着急,马上告诉你三种方法:

  1. 用记事本:打开,点击文件–另存为,在文件名窗口输入 .htaccess,注意是整个绿色部分,也就是包含英文引号,然后点击保存就行了。
  2. 进入 cmd 命令窗口:通过 cd 切换到刚建立 htaccess.txt 文件的文件夹,然后输入命令 rename htaccess.txt .htaccess,然后点击键盘 Enter 键即可。
  3. 通过 FTP 连接htaccess.txt 所在文件夹,通过 FTP 软件重命名。
4. Rewrite 规则学习

我们新建一个 .htaccess 文件之后,就在里面写入以下内容:

RewriteEngine on
# RewriteEngine 为重写引擎开关,on 为开启,off 为关闭
RewriteRule ([0-9]{1,})$ index.php?id=$1
# ([0-9]{1,}) 是指由数字组成的,$ 是结束标志,说明是以数字结束!# 好吧,现在我们可以实现伪静态页面了,写下一个规则:
RewriteEngine on
RewriteRule ([a-zA-Z]{1,})-([0-9]{1,})\.html$ index.php?action=$1&id=$2
# ([a-zA-Z]{1,})-([0-9]{1,})\.html$ 是规则,index.php?action=$1&id=$2 是要替换的格式,
# $1 代表第一个括号匹配的值,$2 代表第二个,如此类推!
总结

本文详细介绍了 PHP 伪静态的概念及其多种实现方法,并通过具体的代码示例展示了每个步骤。通过理解这些基本概念和技术,我们可以更加灵活地在 Web 开发中应用伪静态技术,提升用户体验和搜索引擎优化效果。

相关文章:

PHP 伪静态详解及实现方法

概述 在现代 Web 开发中&#xff0c;URL 的设计对用户体验和搜索引擎优化&#xff08;SEO&#xff09;至关重要。动态 URL 虽然功能强大&#xff0c;但往往显得冗长且不友好。伪静态&#xff08;URL 重写&#xff09;技术通过将动态 URL 转换为静态样式&#xff0c;不仅提高了…...

Spring Boot 简单预览PDF例子

目录 前言 一、引入依赖 二、使用步骤 1.创建 Controller 处理 PDF 生成和预览 2.创建预览页面 总结 前言 使用 Spring Boot 创建一个生成 PDF 并进行预览的项目&#xff0c;你可以按以下步骤进行。我们将使用 Spring Boot、Thymeleaf、iText 等技术来完成这个任务。 一、引入…...

【魔珐有言-注册/登录安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…...

LabVIEW 使用 Snippet

在 LabVIEW 中&#xff0c;Snippet&#xff08;代码片段&#xff09; 是一个非常有用的功能&#xff0c;它允许你将 一小段可重用的代码 保存为一个 图形化的代码片段&#xff0c;并能够在不同的 VI 中通过拖放来使用。 什么是 Snippet&#xff1f; Snippet 就是 LabVIEW 中的…...

单片机_day3_GPIO

目录 1. 灯如何才能亮 1.1原理图 1.2 二极管 1.3 换了一个灯和原理图 ​编辑 1.4 三极管 1.4.1 NPN型三极管 1.4.2 PNP型三极管 2. 基本概念 3. 输入 3.1 浮空输入 3.2 上拉输入 3.3 下拉输入 3.4 模拟输入 4. 输出 4.1 推挽输出 4.2 开漏输出 如何让开漏输出…...

Python小游戏24——小恐龙躲避游戏

首先&#xff0c;你需要安装Pygame库。如果你还没有安装&#xff0c;可以通过以下命令安装&#xff1a; 【bash】 pip install pygame 【python】代码 import pygame import random # 初始化Pygame pygame.init() # 设置屏幕尺寸 screen_width 800 screen_height 600 screen …...

Python 的多态笔记

Python的多态实际是通过instance 实现的 class Person:def __init__(self, name,age):self.name nameself.age agedef feed_pet(self,pet):#isinastance(obj,类)-->判断obj,是不是这个类的对象&#xff0c;或者判断obj是不是该类的子类的对象if isinstance(pet, Pet):sel…...

go module使用

go module介绍 go module是go官⽅⾃带的go依赖管理库,在1.13版本正式推荐使⽤ go module可以将某个项⽬(⽂件夹)下的所有依赖整理成⼀个 go.mod ⽂件,⾥⾯写⼊了依赖的版本等 使⽤ go module之后我们可不⽤将代码放置在src下了 使⽤ go module 管理依赖后会在项⽬根⽬录下⽣成…...

c ++零基础可视化——数组

c 零基础可视化 数组 一些知识&#xff1a; 关于给数组赋值&#xff0c;一个函数为memset&#xff0c;其在cplusplus.com中的描述如下&#xff1a; void * memset ( void * ptr, int value, size_t num );Sets the first num bytes of the block of memory pointed by ptr to…...

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞&#xff0c;实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…...

计算机组成原理笔记----基础篇

计算机系统硬件软件 软件 ├── 系统软件 │ ├── 操作系统 │ └── 工具软件 └── 应用软件├── 办公软件├── 媒体软件└── 浏览器软件硬件 ├── 计算机硬件 │ ├── 中央处理器&#xff08;CPU&#xff09; │ ├── 存储设备 │ │ ├── …...

TheadLocal出现的内存泄漏具体泄漏的是什么?弱引用在里面有什么作用?什么情景什么问题?

首先ThreadLocal是什么就不介绍了&#xff01;这篇是讲讲里面的东西。 再简单说一下强引用和弱引用&#xff0c;举个例子&#xff0c;我们平常new出来的对象就是强引用的&#xff0c;在栈中有强引用&#xff0c;所以在gc的时候&#xff0c;堆中的实例对象不会被清除掉。 弱引…...

AI在电商平台中的创新应用:提升销售效率与用户体验的数字化转型

1. 引言 AI技术在电商平台的应用已不仅仅停留在基础的数据分析和自动化推荐上。随着人工智能的迅速发展&#xff0c;越来越多的电商平台开始将AI技术深度融合到用户体验、定价策略、供应链优化、客户服务等核心业务中&#xff0c;从而显著提升运营效率和用户满意度。在这篇文章…...

CTF-RE 从0到N:RC4

RC4加密算法简介 RC4是由Ron Rivest于1987年设计的一种流加密算法。它通过伪随机数生成器生成密钥流&#xff0c;并将该密钥流与明文进行异或运算来完成加密和解密。 RC4的加密流程 RC4主要包含两个阶段&#xff1a; 密钥调度算法 (Key Scheduling Algorithm, KSA)&#xff…...

HbuilderX 插件开发-模板创建

实现思路 使用HbuilderX 打开某个文档时右键点击的时候获取当前打开的文档内容使用 API 替换为自己的模板 示例 package.json {"id": "SL-HbuilderX-Tool","name": "SL-HbuilderX-Tool","description": "快速创建h…...

打造专业问答社区:Windows部署Apache Answer结合cpolar实现公网访问

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...

YOLO-SLD: An Attention Mechanism-ImprovedYOLO for License Plate Detection

摘要 车辆牌照检测在智能交通系统中发挥着关键作用。检测汽车、卡车和面包车等的牌照对于执法、监控和收费站操作非常有用。如何快速准确地检测牌照对牌照识别至关重要。然而&#xff0c;在现实世界复杂捕捉场景中&#xff0c;光照条件不均匀或牌照拍摄角度的倾斜会发生剧烈变…...

ArcGIS的汉字(亚洲文本)垂直标注

01 需求说明 实现ArcGIS的汉字&#xff08;亚洲文本的垂直标注&#xff09;。 启用 Maplex 标注引擎。 在标注 工具条上单击标注管理器按钮 。 选中要进行标注的图层旁边的复选框。 选择图层下方的标注分类。 单击符号。 选中 CJK 字符方向复选框。 仅当字体有垂直的文本度…...

【面试题】

1.UART 和 IIC 的区别 UART (Universal Asynchronous Receiver-Transmitter) 用途&#xff1a;用于异步串行通信。信号线&#xff1a;通常需要两根线&#xff08;TX 和 RX&#xff09;&#xff0c;有时还需一根地线。通信方式&#xff1a;点对点。数据传输&#xff1a;单向或…...

Leetcode 寻找峰值

为了实现时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;可以使用二分查找法&#xff1a; 解题思路&#xff1a; 峰值的特性是&#xff1a;当前元素大于左右相邻元素。使用二分法&#xff1a; 如果 nums[mid] > nums[mid 1]&#xff0c;说明峰值在左侧或当前…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...