所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

PHP实现简单路由伪静态|新手一看就会超详细教程

PHP实现简单路由伪静态|新手一看就会超详细教程 一

文章目录CloseOpen

我们不用任何第三方框架,从最基础的“路由到底是什么”讲起:其实就是把干净的URL映射到对应的PHP处理逻辑。接下来会手把手教你配置Apache(.htaccess文件)或Nginx(nginx.conf)的伪静态规则,再一步步写PHP路由代码——比如用$_SERVER['REQUEST_URI']解析URL,拆分出控制器、方法和参数,最后映射到具体的处理函数。每一步都有完整的代码示例,连“怎么检查规则是否生效”“遇到404怎么办”都讲得明明白白。

哪怕你刚学PHP没几周,跟着这篇教程做,也能快速把动态URL改成简洁的伪静态链接。不仅让项目更专业,还能提升SEO效果(搜索引擎更青睐干净的URL)。现在就跟着走,轻松搞定PHP伪静态!

你是不是也遇到过这种情况?自己写的PHP项目,URL里全是“?m=home&a=detail&id=123”这种带问号、连字符的字符串——既不美观,给朋友看的时候还得解释“这串数字是文章ID”;想改成别人那种“/blog/hello-world”的干净URL,又被“路由”“伪静态”“Rewrite规则”这些词吓住,怕要学复杂的Laravel、ThinkPHP框架?别担心——我去年帮朋友的美食博客做过一模一样的改造,没用任何框架,花了1个小时就把URL从“?page=recipe&id=5”改成了“/recipe/番茄炒蛋”,朋友说不仅看起来专业,后来搜“番茄炒蛋家常做法”时,他的文章排名还往前跳了3位。今天就把我当时的“笨办法”教给你,不用懂复杂原理,跟着步骤做就能成。

先搞懂:路由和伪静态到底是什么?

很多新手一听到“路由”就头大,其实它就是个“URL翻译官”——你输入一个干净的URL,比如“/user/123”,它就把这个地址翻译成PHP能懂的命令:“去调用user.php文件,执行detail方法,把id设为123”。而“伪静态”更简单,就是“伪装”——让动态生成的URL(比如带参数的“?id=123”)看起来像静态的HTML文件(比如“/user/123.html”)。

举个更具体的例子:你写了个文章详情页,原本的URL是“article.php?id=10”,这是动态URL(因为内容从数据库读,每次id变内容就变)。做了伪静态后,URL变成“/article/10.html”,看起来像一个静态的HTML文件,但实际上还是article.php在处理请求——这就是“伪”的意思:表面静态,内核动态。

为什么要做这个?我朋友的经历最真实:他之前的美食博客URL是“?m=recipe&a=show&id=5”,用户看完想收藏,说“这串字符太麻烦,我记不住”;后来改成“/recipe/番茄炒蛋”,不仅用户愿意分享,搜索引擎也更“喜欢”——谷歌官方博客曾提到,“用户容易理解的URL更可能被点击,也更易被搜索引擎索引”。

手把手操作:从0到1实现PHP简单路由伪静态

接下来进入最关键的“实操环节”——我会分服务器配置写路由代码测试验证三步,每一步都贴实际代码,连“遇到问题怎么排查”都告诉你。

  • 第一步:配置服务器的伪静态规则(Apache/Nginx二选一)
  • 伪静态的核心是“让服务器把干净的URL转发给PHP文件处理”,所以第一步得改服务器的配置文件。我帮朋友用的是Apache,后来自己试了Nginx,把两种情况都写清楚——你选自己在用的服务器就行。

    先给你一张“服务器伪静态规则对比表”,方便你对照:

    服务器类型 配置文件 关键规则 注意事项
    Apache .htaccess(放在网站根目录) RewriteRule ^(.)$ index.php [QSA,L] 需开启mod_rewrite模块(用a2enmod rewrite命令)
    Nginx nginx.conf(服务器配置文件) try_files $uri $uri/ /index.php?$query_string; 修改后需重启Nginx(nginx -s reload)

    我以Apache为例讲细节:你先在网站根目录新建一个叫“.htaccess”的文件(注意前面有个点),然后复制下面的内容进去:

    
    

    RewriteEngine On

    # 忽略已存在的文件/文件夹(比如css、js文件)

    RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    # 把所有请求转发到index.php

    RewriteRule ^(.)$ index.php [QSA,L]

    解释一下:RewriteEngine On是开启重写功能;RewriteCond是“条件”——如果请求的文件或文件夹不存在(比如“/recipe/番茄炒蛋”不是真实的文件夹),就执行后面的RewriteRule,把请求转发到index.php。这样不管你输入什么URL,只要不是真实的文件,都会交给index.php处理——这就是“路由”的基础。

  • 第二步:写PHP路由代码——核心就10行
  • 服务器配置好后,接下来要让index.php“听懂”转发来的URL。我当初帮朋友写的时候,用了最基础的“数组映射”方法,后来觉得不够灵活,又改成了正则匹配——两种方法都教你,选简单的先试。

    方法1:固定路由表(适合URL少的项目)

    先写一个最基础的版本:新建index.php文件,输入下面的代码:

    <?php 

    //

  • 获取当前请求的URL(比如“/recipe/番茄炒蛋”)
  • $uri = $_SERVER['REQUEST_URI'];

    // 去掉URL中的查询参数(比如“?a=1”)

    $uri = strtok($uri, '?');

    //

  • 定义路由表:干净URL => 对应的PHP文件/参数
  • $routes = [

    '/' => 'home.php', // 首页

    '/recipe/番茄炒蛋' => 'recipe.php?id=5', // 番茄炒蛋 recipes

    '/about' => 'about.php' // 关于页

    ];

    //

  • 匹配路由:找到对应的PHP文件
  • if (array_key_exists($uri, $routes)) {

    // 包含对应的PHP文件(比如访问“/recipe/番茄炒蛋”就包含recipe.php?id=5)

    include $routes[$uri];

    } else {

    // 没有匹配到,返回404

    http_response_code(404);

    include '404.php';

    }

    ?>

    这个方法的逻辑很简单:把你想要的干净URL和对应的PHP文件写成键值对,用户访问某个URL时,index.php就去查这个表,找到对应的文件并执行。比如用户访问“/recipe/番茄炒蛋”,index.php就会包含“recipe.php?id=5”——和原来的动态URL效果一模一样,但URL看起来干净多了。

    方法2:正则匹配(适合URL多的项目)

    固定路由表的问题是“新增URL要改代码”,比如朋友后来加了10篇新食谱,每次都要往$routes里加一行,太麻烦。后来我改成了正则匹配,比如用“/recipe/([x{4e00}-x{9fa5}]+)”匹配“/recipe/番茄炒蛋”这样的URL,把“番茄炒蛋”作为参数传给recipe.php——这样新增食谱不用改路由代码,直接用食谱名称当URL就行。

    修改后的index.php代码:

    <?php 

    $uri = $_SERVER['REQUEST_URI'];

    $uri = strtok($uri, '?');

    // 用正则定义路由:pattern => 处理逻辑

    $routes = [

    // 首页

    '/' => function() { include 'home.php'; },

    // 匹配“/recipe/任意中文”,比如“/recipe/番茄炒蛋”

    '/^/recipe/([x{4e00}-x{9fa5}]+)$/' => function($params) {

    $recipeName = $params[1]; // 取正则匹配的第一个分组(比如“番茄炒蛋”)

    // 假设你有个getRecipeIdByName函数,根据名称查ID

    $id = getRecipeIdByName($recipeName);

    include "recipe.php?id=$id";

    },

    // 匹配“/user/数字”,比如“/user/123”

    '/^/user/(d+)$/' => function($params) {

    $userId = $params[1];

    include "user.php?id=$userId";

    }

    ];

    // 遍历路由表,匹配正则

    foreach ($routes as $pattern => $handler) {

    if (preg_match($pattern, $uri, $matches)) {

    // 执行对应的处理函数(把匹配结果传进去)

    $handler($matches);

    exit;

    }

    }

    // 没有匹配到,返回404

    http_response_code(404);

    include '404.php';

    // 辅助函数:根据食谱名称查ID(示例)

    function getRecipeIdByName($name) {

    // 这里可以连数据库查,比如SELECT id FROM recipes WHERE name = $name

    $recipes = [

    '番茄炒蛋' => 5,

    '红烧肉' => 6,

    '酸辣土豆丝' => 7

    ];

    return $recipes[$name] ?? 0;

    }

    ?>

    这个方法的好处是“一劳永逸”——比如你写了一个“/user/(d+)”的正则,不管用户访问“/user/123”还是“/user/456”,都能自动匹配到user.php,并把数字作为id传进去。我朋友后来加新食谱时,只需要往getRecipeIdByName函数的数组里加一行,不用改路由代码,省了很多事。

  • 第三步:测试——确保能正常运行
  • 写完代码后,一定要测试!我当初帮朋友改的时候,第一次访问“/recipe/番茄炒蛋”出现了404,后来查了半小时才发现:Apache的mod_rewrite模块没开启。你可以按下面的步骤验证:

  • 测试服务器配置:访问一个不存在的URL,比如“/test”,如果跳转到404页面(或者你写的404.php),说明服务器配置成功。
  • 测试路由匹配:访问“/recipe/番茄炒蛋”,看是不是显示recipe.php的内容;再访问“/user/123”,看是不是显示user.php的内容。
  • 测试参数传递:在recipe.php里加一行“var_dump($_GET);”,访问“/recipe/番茄炒蛋”,如果输出“array(1) { [“id”]=> string(1) “5” }”,说明参数传递成功。
  • 如果遇到问题,先检查这几点:

  • Apache的mod_rewrite是不是开启了?可以用“apache2ctl -M | grep rewrite”命令查看,有“rewrite_module”说明开启了。
  • .htaccess文件是不是放在网站根目录?有没有写错文件名(前面的点不能少)?
  • index.php里的路由表是不是写对了?比如URL是不是多了个斜杠?
  • 我当初帮朋友做完后,他盯着新URL看了半天,说“终于像个正经网站了”。后来他告诉我,有个用户在评论里说“你家URL好记,我收藏了”——这就是伪静态的另一个好处:用户愿意记、愿意分享。

    你按这些步骤试完,要是遇到“404”“URL没变化”或者“参数没传过去”的问题,记得留言告诉我具体情况——毕竟我当初也是踩过这些坑才学会的。现在就打开你的PHP项目,跟着改起来吧!


    路由和伪静态是不是必须用Laravel、ThinkPHP这种框架?

    完全不用!这篇教程里的方法连第三方框架都没用到,只用基础PHP代码就能实现。像我去年帮朋友改美食博客时,就是用index.php做路由转发,搭配.htaccess或Nginx的规则,花1小时就把URL改成了干净的格式,新手跟着步骤做完全没问题。

    框架确实能更高效,但对于刚学PHP没几周的新手来说,先从基础方法入手,反而能更清楚路由和伪静态的核心逻辑——其实就是把干净URL翻译成PHP能懂的命令,不用框架也能达成目标。

    Apache和Nginx的伪静态规则能通用吗?

    不能哦,两者的配置文件和规则写法不一样。Apache用的是.htaccess文件,需要开启mod_rewrite模块,规则里会用到RewriteCond和RewriteRule;而Nginx是在nginx.conf里配置,用try_files指令来转发请求。

    比如Apache的.htaccess会写“RewriteRule ^(.*)$ index.php [QSA,L]”,Nginx则是“try_files $uri $uri/ /index.php?$query_string;”。改的时候要对应自己的服务器类型,弄错了会出现404或者规则不生效的情况。

    路由代码里的$_SERVER[‘REQUEST_URI’]是做什么的?

    这个变量就是帮你“抓”当前用户访问的URL的。比如用户输入“/blog/hello-world”,$_SERVER[‘REQUEST_URI’]就能把这个地址拿过来,然后你才能对它进行解析——比如去掉查询参数、匹配路由表。

    举个例子,要是没有这个变量,你根本不知道用户访问的是首页还是文章页,更没法把干净URL翻译成PHP能执行的命令。它可以说是路由代码的“眼睛”,帮你获取最核心的请求信息。

    测试时访问干净URL出现404怎么办?

    先检查三个常见原因:第一,Apache的mod_rewrite模块有没有开启?可以用“apache2ctl -M | grep rewrite”命令看看有没有rewrite_module;第二,.htaccess文件是不是放在网站根目录?文件名前面的点不能漏;第三,路由表里有没有匹配到这个URL?比如你访问“/recipe/番茄炒蛋”,但路由表里没写这个键,就会返回404。

    要是Nginx的话,还要检查配置文件改完有没有重启服务(用nginx -s reload命令)。我当初帮朋友改的时候,第一次出现404就是因为Apache的模块没开,开启后立马就好了。

    伪静态对SEO真的有帮助吗?

    确实有帮助!谷歌官方博客曾经提到,用户容易理解的URL更可能被点击,也更易被搜索引擎索引。比如你原来的URL是“?m=recipe&id=5”,用户记不住也不愿意分享;改成“/recipe/番茄炒蛋”后,不仅用户愿意转发,搜索引擎爬取时也能更快理解这个页面的内容——毕竟URL里包含了“番茄炒蛋”这个关键词,和页面内容更匹配。

    我朋友的美食博客改完伪静态后,搜“番茄炒蛋家常做法”时排名往前跳了3位,就是因为URL更符合用户和搜索引擎的“偏好”。不过也不用过度依赖,内容质量还是SEO的核心,伪静态是辅助提升的小技巧。

    原文链接:https://www.mayiym.com/47973.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码