一、什么是伪静态?为什么要用它?
-
动态URL示例:
https://www.ygwzjs.cn/article.php?id=123&category=news
- 难看,参数多,不利于SEO和分享。
-
对应的伪静态URL示例:
https://www.hybiaobai.cn/article/123/news.html
- 简洁、有层次感,看起来像一个静态页面,搜索引擎和用户都喜欢。
- 简洁、有层次感,看起来像一个静态页面,搜索引擎和用户都喜欢。
核心原理: 当用户访问 article/123/news.html
时,服务器(通过规则)在内部将这个请求"重写"为 article.php?id=123&category=news
来处理,然后返回结果给用户。用户浏览器地址栏显示的依然是那个简洁的URL。
二、设置伪静态的前提条件
-
服务器支持 URL 重写模块:
-
Apache服务器: 需要开启
mod_rewrite
模块。绝大多数虚拟主机都默认开启。 -
Nginx服务器: 默认支持强大的
rewrite
功能,但配置方式与Apache不同。 -
IIS服务器: 需要安装并配置
URL Rewrite
模块。
-
-
网站程序支持: 您的网站程序(如 WordPress, Discuz!, ThinkPHP 等)必须支持路由功能,即能够解析伪静态后的URL。现代主流程序都支持。
-
权限: 您需要能修改服务器配置文件(拥有服务器 root 权限)或者在网站根目录下创建/修改
.htaccess
文件(虚拟主机用户常用)。
三、详细设置步骤(分服务器类型)
我们将重点讲解最常用的 Apache 和 Nginx 的设置方法。
方法一:Apache 服务器设置伪静态(最常见)
Apache主要通过根目录下的 .htaccess
文件来配置。
步骤 1:开启 mod_rewrite 模块
-
如果是自己的VPS或服务器,需要确保
httpd.conf
文件中有这行,且没有被注释掉(前面没有#
):apache
LoadModule rewrite_module modules/mod_rewrite.so
-
同时,在对应的
<Directory>
配置段中,将AllowOverride
设置为All
,这样才能允许.htaccess
文件生效。apache
<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride All # 这里很重要,必须是 All Require all granted </Directory>
-
修改后,重启 Apache 服务。
-
对于虚拟主机用户: 通常服务商已经配置好了,您无需进行此步,直接进行下一步。
步骤 2:创建 .htaccess 文件
-
在您网站的根目录 下(例如
wwwroot
或htdocs
),创建一个名为.htaccess
的文件。注意文件名开头有个点。 -
如果无法直接创建,可以先创建一个
htaccess.txt
文件,上传到服务器后通过FTP工具重命名为.htaccess
。
步骤 3:编写重写规则
这是最关键的一步。规则因程序而异。.htaccess
文件的基本结构如下:
apache
<IfModule mod_rewrite.c>
RewriteEngine On # 开启重写引擎
RewriteBase / # 设置重写基准目录,如果网站在根目录就是 /
# 这里开始写具体的重写规则
# 规则语法:RewriteRule 模式 替换 [标志]
# 示例规则 1:将 article/123.html 重写为 article.php?id=123
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]
# 示例规则 2:隐藏URL中的 .php 扩展名
# 访问 /about 会实际执行 /about.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
# 以下是 WordPress 的经典规则:
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
规则解释:
-
RewriteRule ^article/([0-9]+)\.html$ article.php?id=$1 [L]
-
^article/([0-9]+)\.html$
是正则表达式,匹配以article/
开头,后面是数字([0-9]+
),并以.html
结尾的URL。括号()
表示捕获这部分内容。 -
article.php?id=$1
是实际要执行的动态URL。$1
代表前面规则中第一个括号捕获的内容。 -
[L]
是标志,表示如果这条规则匹配,就停止处理后续规则。
-
-
RewriteCond
是重写条件,用于判断。-
!-f
表示"不是已存在的文件"。 -
!-d
表示"不是已存在的目录"。
-
最佳实践: 您通常不需要自己编写规则 。您使用的网站程序(如 WordPress、Discuz! 等)的官方文档或后台设置中都会提供标准的 .htaccess
规则,直接复制粘贴即可。
步骤 4:测试
保存 .htaccess
文件后,在浏览器中访问您设置好的伪静态链接,如 https://您的网站/article/123.html
,看是否能正常显示内容。
方法二:Nginx 服务器设置伪静态
Nginx 的配置不通过 .htaccess
文件,而是直接在服务器的配置文件中 修改(通常是 nginx.conf
或 vhost
目录下您的网站对应的 .conf
文件)。
步骤 1:编辑配置文件
-
使用SSH连接到您的服务器。
-
找到您的网站Nginx配置文件,位置可能因安装方式而异,例如
/etc/nginx/conf.d/your_site.conf
或/etc/nginx/sites-available/your_site
。 -
使用
sudo
和文本编辑器(如vim
或nano
)进行编辑。
步骤 2:在 server { } 块中编写重写规则
规则写在 location / { ... }
块内。
nginx
server {
listen 80;
server_name hywushu.cn;
root /path/to/your/website;
index index.html index.php;
location / {
# 开启重写功能
try_files $uri $uri/ /index.php?$args; # 这是 WordPress 等程序常用的一个万能规则
# 或者使用 rewrite 指令自定义规则
# 示例:将 article/123.html 重写为 article.php?id=123
rewrite ^/article/([0-9]+)\.html$ /article.php?id=$1 last;
}
# 处理 PHP 文件的配置
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据你的PHP版本修改
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
规则解释:
-
rewrite ^/article/([0-9]+)\.html$ /article.php?id=$1 last;
-
语法与Apache类似。
^/article/([0-9]+)\.html$
是匹配模式,/article.php?id=$1
是重写目标。 -
last
标志相当于Apache的[L]
,表示完成当前重写后停止,并用重写后的URI重新搜索location。
-
步骤 3:检查配置并重载Nginx
修改保存后,至关重要的一步是检查配置文件语法是否正确。
-
运行测试命令:
sudo nginx -t
-
如果显示
syntax is ok
和test is successful
,则说明配置正确。 -
重载Nginx使配置生效:
sudo systemctl reload nginx
步骤 4:测试
同样,在浏览器中访问伪静态链接进行测试。
四、常见程序的伪静态规则
-
WordPress:
-
Apache(.htaccess): 在WP后台"设置"->"固定链接"中,选择除了"朴素"以外的任何结构,WP会自动在网站根目录生成或更新
.htaccess
文件。 -
Nginx: 常用规则是
try_files $uri $uri/ /index.php?$args;
。
-
-
Discuz! X:
- 后台"全局"->"SEO设置"->"URL静态化"中,勾选需要静态化的页面,并选择您的服务器类型(Apache/Nginx),系统会直接给出对应的规则,复制到相应位置即可。
-
ThinkPHP:
-
框架自带路由功能。对于Apache,通常需要以下规则:
apache
RewriteRule ^(.*)$ index.php?$1 [QSA,PT,L]
-
对于Nginx,通常需要:
nginx
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$1 last; } }
-
总结与注意事项
-
备份!备份!备份! 在修改服务器配置文件或
.htaccess
文件前,务必备份原文件。 -
先测试规则: 可以使用在线正则表达式工具测试你写的规则是否能正确匹配。
-
分清服务器类型: Apache用
.htaccess
,Nginx用配置文件,规则语法不同,切勿混用。 -
清除浏览器缓存: 修改规则后,测试时最好使用浏览器无痕模式或强制刷新(Ctrl+F5),避免缓存干扰。
-
查看错误日志: 如果出现500等错误,第一时间查看服务器的错误日志(Apache的
error_log
或 Nginx的error.log
),里面会有详细的错误信息,对排查问题至关重要。