目錄
回复内容:
首頁 後端開發 php教程 Typecho/WordPress 是怎样做到伪静态的?

Typecho/WordPress 是怎样做到伪静态的?

Jun 06, 2016 pm 08:45 PM
php 偽靜態

我在自己的博客(Typecho)上开启伪静态的时候,文章不能正常访问,然后在站点根目录创建了一个 .htaccess 文件并且添加了一句 RewriteEngine On ,文章就能正常访问了。请问这是怎么实现的?是单纯的靠 PHP 实现伪静态吗?可是这好像也涉及到了服务器的配置啊。
我的主机是 Linux + Apache 2.2 + PHP 5.3 。


我在网上找过只靠 PHP 程序来实现伪静态的代码,可是在虚拟机上测试不通过;添加 .htaccess 文件之后还是不能实现,代码如下:

<?php
function mod_rewrite($url='',$rootURL='http://www.phpernote.com/'){
    global $_GET;
    $url=empty($url)?cur_page_url():$url;
    $url=str_ireplace(array($rootURL,'.html'),'',$url);
    $url=explode('/',$url);
    $_GET=$url;
    return $_GET;
}
/*获取当前页面的URL(包括参数)*/
function cur_page_url(){
    $pageURL='http';
    $_SERVER['HTTPS']=='on' && $pageURL.='s';
    $pageURL.='://';
    $pageURL.=$_SERVER['SERVER_PORT']!='80'?$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI']:$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    return $pageURL;
}
mod_rewrite('http://www.phpernote.com/open-source-plug-in/592.html');
echo '<pre class="brush:php;toolbar:false">';print_r($_GET);
登入後複製
登入後複製

代码来源地址:http://www.phpernote.com/php-function/729.html

回复内容:

我在自己的博客(Typecho)上开启伪静态的时候,文章不能正常访问,然后在站点根目录创建了一个 .htaccess 文件并且添加了一句 RewriteEngine On ,文章就能正常访问了。请问这是怎么实现的?是单纯的靠 PHP 实现伪静态吗?可是这好像也涉及到了服务器的配置啊。
我的主机是 Linux + Apache 2.2 + PHP 5.3 。


我在网上找过只靠 PHP 程序来实现伪静态的代码,可是在虚拟机上测试不通过;添加 .htaccess 文件之后还是不能实现,代码如下:

<?php
function mod_rewrite($url='',$rootURL='http://www.phpernote.com/'){
    global $_GET;
    $url=empty($url)?cur_page_url():$url;
    $url=str_ireplace(array($rootURL,'.html'),'',$url);
    $url=explode('/',$url);
    $_GET=$url;
    return $_GET;
}
/*获取当前页面的URL(包括参数)*/
function cur_page_url(){
    $pageURL='http';
    $_SERVER['HTTPS']=='on' && $pageURL.='s';
    $pageURL.='://';
    $pageURL.=$_SERVER['SERVER_PORT']!='80'?$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI']:$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    return $pageURL;
}
mod_rewrite('http://www.phpernote.com/open-source-plug-in/592.html');
echo '<pre class="brush:php;toolbar:false">';print_r($_GET);
登入後複製
登入後複製

代码来源地址:http://www.phpernote.com/php-function/729.html

Wordpress,

完整的apache .htaccess是这样的

<code><IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
</code>
登入後複製

nginx, 则是

<code>location / {

    try_files $uri $uri/ /index.php?$args;
  }
</code>
登入後複製

两者都是实现一个目地:
将所有的uri请求转给index.php. index.php作为入口, 在某个时候调用wp-includes/class-wp.php,
由parse_request函数负责解析当前的uri.

我举个简单的例子,当你的permalink structure设置为/%postname%/%post_id%.html

然后,wp内部生成相对应的正则, ([^/]+)/([0-9]+).html(/[0-9]+)?/?$

访问http://www.test.com/i-am-a-post/123.html时,

<code>list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] );
$req_uri = trim($req_uri, '/');
</code>
登入後複製

这时,$req_uri的值为i-am-a-post/123.html. 与permalink structure的正则匹配上了,获取后面的id,也就是123, 然后就是get_post了...

这个例子是非常简化版的wp解析uri过程.

大部分程序,包括框架,也是这样实现你所谓的"伪静态".

一般,大家都称这个过程为routing. 由两个部分组成: parser 和dispatcher.

你那个例子,勉强算是parser. 还少了个dispatcher.

不推荐阅读wp代码, 尤其是新手.


补充下:
wp生成的正则 ([^/]+)/([0-9]+).html(/[0-9]+)?/?$.

后面的(/[0-9]+)?/?$ 是用来匹配分页的.

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南

CakePHP 專案配置 CakePHP 專案配置 Sep 10, 2024 pm 05:25 PM

CakePHP 專案配置

CakePHP 日期和時間 CakePHP 日期和時間 Sep 10, 2024 pm 05:27 PM

CakePHP 日期和時間

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

CakePHP 檔案上傳

CakePHP 路由 CakePHP 路由 Sep 10, 2024 pm 05:25 PM

CakePHP 路由

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

討論 CakePHP

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 快速指南

See all articles