第四章:第41节 PHP预定义变量$_SERVER——URL重写与伪静态

更新于:2017-04-06 20:55:07

前面介绍$_GET时楠神说过,现在大部分网站都不直接依靠get方式获取参数,都不直接在URL访问一个PHP文件,而是采用重写URL的方式。URL重写会消耗点资源,这样做一是为了安全,二是为了SEO优化,让访问网址变得更简洁。


实现URL重写,必须依靠$_SERVER['REQUEST_URI']


大家应该都知道,直接输入域名就可以访问网站,这是因为网站都有默认首页,就是如果域名后面不带具体的目录或者文件名,例如(https://www.phpnanshen.com/),就会默认执行网站的首页文件。服务器软件都有专门设置默认首页的地方,比如Apache里配置文件

1.png

默认先去执行index.html,没有依次往下找。


楠神在网站根目录添加一个index.php文件

1.png

直接输入域名:

1.png

可以访问到这个index.php文件,此时变量$_SERVER['REQUEST_URI']的值是“/”。


一、只用PHP实现URL重写


“?”在网址中主要起到传参数的作用,在https://www.phpnanshen.com/后面加个“?”,后面随便输入字符串,看结果:


1.png

1.png

1.png

通过$_SERVER['REQUEST_URI']、$_GET PHP都能获取到URL中“?”后面的字符串,为了正确实现URL重写,推荐用$_SERVER['REQUEST_URI']获取参数,用$_GET会出现问题的。


看上图中,$_SERVER['REQUEST_URI']的值“/?1.html”,如果“/?”与“.html”之间的数字是一个参数,PHP程序如果能获取到这个数字参数,就可以让页面显示不同的东西。比方说,这个数字是文章的ID,程序就可以通过这个数字ID从数据库获取指定的文章,页面就可以实现数字不同显示的文章不同。本质上是和“靠get方式传参,$_GET获取参数”一样,只是实现的方式不一样。


怎么获取这个数字,方法有很多,PHP提供了很多操作字符串的内置函数,但最好的办法依靠“正则表达式”实现。


什么是正则表达式?楠神先做个介绍,后面的课程再去详细讲解。想学的网上关于正则表达式的教程很多,非常简单。

依靠正则表达式可以去验证,比如一串数字符不符合手机号的格式,一串字符串符不符合邮箱的格式。

依靠正则表达式可以去获取指定的字符串,比如依靠正则表达式,程序可以从“/?1.html”获取到“/?”与“.html”之间的数字1。

正则表达式是程序员都必须要了解,要会的东西。


1.png


楠神定义的依靠正则表达式获取网址里的“/?”与“.html”之间的数字

1.png

看效果:

1.png

获取到1了,因为楠神的函数做了限制,“/?”与“.html”之间只能是数字,如果非数字不获取。


到这里PHP的URL重写工作就算完成了,如果想把“?”去掉,可以换成这样:

https://www.phpnanshen.com/index.php/1.html

执行的依然是index.php文件,数字1可以通过正则表达式获取


想变成这样:

https://www.phpnanshen.com/1.html,必须依靠服务器才能实现,PHP自己实现不了。


二、依靠服务器URL重写


以Apache为例,不同的服务器软件重写方式是不一样的,以下方式只适用于Apache服务器。


1、打开Apache的重写模块,在配置文件里,150行如果有“#”注释,请去掉。

1.png

楠神推荐的PHPstudy集成开发软件默认是打开重写模块的。


2、在网站根目录放置.htaccess文件,里面的内容:

1.png


1.png

在浏览器输入:

1.png

“/”与“.html”之间的123轻松获取到了。


说明几点:

1、Apache服务器是这样的,用户输入网址“https://www.phpnanshen.com/123.html”,Apache先去网站根目录查找有没有123.html这个文件,如果有显示123.html文件,没有才去网站根目录查看.htaccess文件有没有符合的重写规则。


2、关于.htaccess文件的重写规则百度搜索了解,楠神提供的.htaccess文件可以适用于大部分网站。


3、.htaccess文件第7行,朋友们应该能看明白点什么意思,比如https://www.phpnanshen.com/123.html  Apache通过这一行会自动把网址转成https://www.phpnanshen.com/index.php?/123.html


4、URL重写不仅能迷惑用户,让其不知道真正执行的是什么文件。还实现了让访问网站的所有用户都从index.php这一入口文件进入,符合现在网站通用的一种架构思想。


再说下什么是伪静态,上面我们已实现了伪静态。


比如说https://www.phpnanshen.com/123.html,用户第一直观感觉这就是一个静态网页,在https://www.phpnanshen.com根目录下有个123.html文件,其实不是,URL重写了,访问的是https://www.phpnanshen.com/index.php文件。


下表中列出了一些URL特殊符号及编码

14ce36d3d539b6005574d31eea50352ac75cb7e5.jpg

网址URL中除了数字和字母表示文件和文件夹,还有这些字符的存在。有兴趣的可去网上搜搜各自的作用。


本节学习代码》》》