本文目录导读:

为PHP项目配置伪静态规则(URL重写)主要是依赖 Web 服务器(通常是 Apache 或 Nginx)来完成的,核心思想是将请求(如 index.php?id=123)通过正则匹配重写为对用户和搜索引擎友好的形式(如 post/123.html)。
以下是针对Apache和Nginx两个最常见环境的具体配置步骤。
Apache 服务器(最通用,支持 .htaccess)
这是虚拟主机和大多数共享空间最常用的方式。
启用 mod_rewrite 模块
确保 Apache 已加载重写模块,在终端或控制面板中启用:
# Debian/Ubuntu sudo a2enmod rewrite # CentOS/RHEL # 通常默认已启用,如果未启用需修改 httpd.conf
重启 Apache:
sudo systemctl restart apache2 # 或 httpd
配置虚拟主机或 .htaccess 文件
方法 A:直接修改虚拟主机配置(推荐,性能更好)
找到你网站的 <VirtualHost> 配置段,添加或修改 Directory 部分:
<VirtualHost *:80>
DocumentRoot "/var/www/html/myproject"
ServerName www.example.com
<Directory "/var/www/html/myproject">
Options FollowSymLinks
# 允许重写规则覆盖
AllowOverride All
# 或者如果不需要额外 .htaccess,直接用下面的代码:
# AllowOverride None
# 并在此处直接写规则
</Directory>
# 如果上面 AllowOverride 为 None 或 All 但你想统一管理,直接写在这里:
<IfModule mod_rewrite.c>
RewriteEngine On
# 以下为规则示例(见下方)
</IfModule>
</VirtualHost>
方法 B:使用 .htaccess 文件(最简单,适合新手或无法修改服务器配置时)
在项目根目录(通常是 public 或 www 文件夹)下创建或编辑一个名为 .htaccess 的文件。
常见规则模板(以 ThinkPHP、Laravel、CodeIgniter 等框架为例):
<IfModule mod_rewrite.c>
Options +FollowSymlinks -MultiViews
RewriteEngine On
# 设置基础路径(如果项目放在子目录,如 /blog,则写为 /blog/)
RewriteBase /
# 1. 强制去掉 index.php(需配合框架路由)
# 如果请求的文件或目录真实存在,则直接访问
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# 将所有非文件的请求重定向到 index.php
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
# 或者对某些框架:
# RewriteRule ^(.*)$ index.php [QSA,E=PATH_INFO:$1]
# 2. 自定义伪静态规则示例
# 将 article/123.html 映射到 index.php?cate=article&id=123
RewriteRule ^article/(\d+)\.html$ index.php?cate=article&id=$1 [L]
# 3. 带上查询参数(QSA 标志)
RewriteRule ^product/(\w+)/?$ index.php?action=view&slug=$1 [QSA,L]
# 4. 禁止访问某些敏感文件
RewriteRule ^(config|database)\.(yml|php)$ - [F,L]
</IfModule>
刷新并测试
将上述代码保存后,访问 http://yourdomain/article/123.html,如果正常显示原来 ?cate=article&id=123 的内容,则配置成功。
Nginx 服务器(高性能,通常用于 VPS 或云服务器)
Nginx 不支持 .htaccess,所有规则需写在 server 块中。
修改 Nginx 配置
找到你网站的 Server 配置块文件(通常在 /etc/nginx/sites-available/ 下)。
添加 location 重写规则
基础模板(通用,适配主流框架):
server {
listen 80;
server_name www.example.com;
root /var/www/html/myproject/public; # 项目入口目录(如 public 或根目录)
index index.php index.html;
# 核心:处理所有请求
location / {
# 尝试按顺序查找文件:如果找到真实文件或目录则直接返回,
# 否则交给 index.php 处理
try_files $uri $uri/ /index.php?$query_string;
# 注:有些框架需要 PATH_INFO,可改成:
# try_files $uri $uri/ /index.php$is_args$args;
}
# 自定义伪静态规则示例(放在上面的 location 之外或之内均可)
location /article/ {
rewrite ^/article/(\d+)\.html$ /index.php?cate=article&id=$1 last;
}
# 防止访问敏感文件
location ~ /\.(ht|git|svn) {
deny all;
}
# PHP 文件处理(必不可少)
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据实际版本修改
}
}
关键点说明:
try_files $uri $uri/ /index.php?$query_string;是最通用的“入口文件”重写方式。last标志表示重写后停止当前 location 处理,重新匹配新的 location(通常匹配到.php$的 location 进行处理)。
检查语法并重载
sudo nginx -t # 测试语法 sudo systemctl reload nginx # 重新加载配置
不同框架的常见配置(快速参考)
| 框架 | Apache .htaccess 核心行 | Nginx 核心行 |
|---|---|---|
| Laravel | RewriteRule ^(.*)$ public/index.php?/$1 [L] |
try_files $uri $uri/ /index.php?$query_string; (root 指向 public) |
| ThinkPHP 5/6 | RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] |
try_files $uri $uri/ /index.php?$query_string; |
| WordPress | 标准模板自带 .htaccess | try_files $uri $uri/ /index.php?$args; |
| CodeIgniter | RewriteRule ^(.*)$ index.php?/$1 [L] |
try_files $uri $uri/ /index.php?$query_string; |
| Yii2 | RewriteRule ^(.*)$ index.php?/$1 [L] |
try_files $uri $uri/ /index.php?$args; |
注意事项与排错
-
确认 Rewrite 模块已加载:
- Apache:
phpinfo()查看mod_rewrite是否存在。 - Nginx:编译时默认包含 rewrite 模块。
- Apache:
-
路径问题:
- Apache 中
RewriteBase /如果项目在子目录,需要改为/子目录名/。 - Nginx 中
root一定要指向项目的前端控制器目录(如public或web)。
- Apache 中
-
日志查看:
- Apache:
tail -f /var/log/apache2/error.log - Nginx:
tail -f /var/log/nginx/error.log或access.log
- Apache:
-
文件权限:
- Apache 的
.htaccess文件需要有读取权限(如644)。
- Apache 的
-
测试是否生效:访问一个不存在的路径(如
http://yourdomain/test-rewrite),看是否由index.php接管(可通过在index.php中打印$_SERVER['REQUEST_URI']确认)。
- 如果你是虚拟主机用户:在根目录上传一个
.htaccess文件即可。 - 如果是自购服务器(VPS):推荐使用 Nginx,直接在配置文件中写
try_files规则。 - 关键是让所有非真实文件的请求都指向
index.php,然后由 PHP 框架的路由系统解析 URL。
如果按上述配置仍不生效,请检查服务器日志并根据框架官方文档微调路径。