如何为PHP项目配置伪静态规则?

wen PHP项目 2

本文目录导读:

如何为PHP项目配置伪静态规则?

  1. Apache 服务器(最通用,支持 .htaccess
  2. Nginx 服务器(高性能,通常用于 VPS 或云服务器)
  3. 不同框架的常见配置(快速参考)
  4. 注意事项与排错

为PHP项目配置伪静态规则(URL重写)主要是依赖 Web 服务器(通常是 Apache 或 Nginx)来完成的,核心思想是将请求(如 index.php?id=123)通过正则匹配重写为对用户和搜索引擎友好的形式(如 post/123.html)。

以下是针对ApacheNginx两个最常见环境的具体配置步骤。


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 文件(最简单,适合新手或无法修改服务器配置时) 在项目根目录(通常是 publicwww 文件夹)下创建或编辑一个名为 .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;

注意事项与排错

  1. 确认 Rewrite 模块已加载

    • Apache:phpinfo() 查看 mod_rewrite 是否存在。
    • Nginx:编译时默认包含 rewrite 模块。
  2. 路径问题

    • Apache 中 RewriteBase / 如果项目在子目录,需要改为 /子目录名/
    • Nginx 中 root 一定要指向项目的前端控制器目录(如 publicweb)。
  3. 日志查看

    • Apache:tail -f /var/log/apache2/error.log
    • Nginx:tail -f /var/log/nginx/error.logaccess.log
  4. 文件权限

    • Apache 的 .htaccess 文件需要有读取权限(如 644)。
  5. 测试是否生效:访问一个不存在的路径(如 http://yourdomain/test-rewrite),看是否由 index.php 接管(可通过在 index.php 中打印 $_SERVER['REQUEST_URI'] 确认)。

  • 如果你是虚拟主机用户:在根目录上传一个 .htaccess 文件即可。
  • 如果是自购服务器(VPS):推荐使用 Nginx,直接在配置文件中写 try_files 规则。
  • 关键是让所有非真实文件的请求都指向 index.php,然后由 PHP 框架的路由系统解析 URL。

如果按上述配置仍不生效,请检查服务器日志并根据框架官方文档微调路径。

抱歉,评论功能暂时关闭!