30826 大佬有话说 : 2020-1-18 20:26:21
【技术贴】PHP全能路由,自适应网站路径,采集站必备
本帖最后由 30826 于 2020-1-18 20:34 编辑
网站路由(不是机房路由器)一直是个头疼的问题,对于网站路径市面上有两种解决方案:
1. 用户输入网站地址,采用绝对路径,例如WordPress、Typecho,难以实现单网站多域名。
2. 使用相对路径自适应,例如Xiuno,无法处理带有/的URI路径参数。
于是写了一个PHP路由,可适用于二级目录、无伪静态情况,可处理多级URI路径、GET参数。
【演示】
主页:http://demo.freevar.com/route/
这个演示文件是二级目录route中的index.php,可以适应。
无伪静态:http://demo.freevar.com/route/index.php/adfds/hfdsgsf?a=1&b=2
当服务器不支持伪静态时,使用/index.php/访问,获得同样效果。
有伪静态:http://demo.freevar.com/route/adfds/hfdsgsf?a=1&b=2
开启伪静态后,网站URL地址更加美观。
【说明】
文件根目录:程序文件所在路径,用于调用资源。例如引用[文件根目录/style.css],可以正确定位到文件。
网站根目录:网站主页地址,兼容无伪静态。例如无伪静态时将链接到,确保可访问。
请求路径:用户请求的路径,作为一个参数调用。例如访问[网站/zhuji/usa.html],该参数为。
请求参数:GET请求(?)后的参数数组,单独提取供调用,区别于REQUEST_URI。
程序名:可以不是index.php,但服务器要重新设置主页为该文件。
【代码】
<?php
define(‘wenjiangenmulu’,substr($_SERVER[‘SCRIPT_NAME’],0,strripos($_SERVER[‘SCRIPT_NAME’],’/’)+1));
define(‘wangzhangenmulu’,(stripos($_SERVER[‘REQUEST_URI’],$_SERVER[‘SCRIPT_NAME’])===0)?$_SERVER[‘SCRIPT_NAME’].’/’:wenjiangenmulu);
define(‘qingqiulujing’,substr(stristr($_SERVER[‘REQUEST_URI’],’?’,true)?:$_SERVER[‘REQUEST_URI’],strlen(wangzhangenmulu)));
echo ‘
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>全能路由</title>
</head>
<body>
<b>全能路由</b><br />
[文件根目录] ‘.wenjiangenmulu.'<br />
[网站根目录] ‘.wangzhangenmulu.'<br />
[请求路径] ‘.qingqiulujing.'<br />
[请求参数]
<br />
‘;
print_r($_GET);
echo ‘
<br />
[服务器]
<br />
‘;
print_r($_SERVER);
echo ‘
<br />
</body>
</html>
‘;
?>
【服务器重写配置】
Apache:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^route/(.*)$ /route/index.php
Nginx:
location /route {
try_files $uri $uri/ /route/index.php?$args;
}
uni2046 大佬有话说 : 2020-1-18 20:27:27
感觉好牛逼
30826 大佬有话说 : 2020-1-18 20:28:25
uni2046 大佬有话说 : 2020-1-18 20:27
感觉好牛逼
大佬多都太谦虚:lol
快雪时晴 大佬有话说 : 2020-1-18 20:30:34
现在不都是框架嘛
30826 大佬有话说 : 2020-1-18 20:32:25
快雪时晴 大佬有话说 : 2020-1-18 20:30
现在不都是框架嘛
框架局限太多了,很多需求还是要自己写……
朕的大清完了? 大佬有话说 : 2020-1-18 20:42:50
框架不香吗?
自己写的话,也没几个页面,直接手工做个伪静态规则就好了
30826 大佬有话说 : 2020-1-18 20:52:08
朕的大清完了? 大佬有话说 : 2020-1-18 20:42
框架不香吗?
自己写的话,也没几个页面,直接手工做个伪静态规则就好了 …
强迫症啊,实在懒得写一堆伪静态规则……
像我这种WP的伪静态可以直接拿来用。
阿良 大佬有话说 : 2020-1-18 21:32:29
马克一下。。
秘密 大佬有话说 : 2020-1-18 21:39:34
先收藏一下
lunone 大佬有话说 : 2020-1-18 21:50:45
恰巧前一段搞过这玩意,看大佬用的是REQUEST_URI,实际上REQUEST_URI,也并不完全一致,我看到还特意过滤了一下queryString,其实各个服务器默认行为和配置还真不保险的。忘了具体心路历程了。在尝试过好多版本情况下,现在的选择是优先path_info,其次request_uri,最后实在不行用SCRIPT_NAME。每个服务器具体情况都不复杂,想写出一个能通用匹配的还真是头大。