前面介绍$_GET时楠神说过,现在大部分网站都不直接依靠get方式获取参数,都不直接在URL访问一个PHP文件,而是采用重写URL的方式。URL重写会消耗点资源,这样做一是为了安全,二是为了SEO优化,让访问网址变得更简洁。
实现URL重写,必须依靠$_SERVER['REQUEST_URI']。
大家应该都知道,直接输入域名就可以访问网站,这是因为网站都有默认首页,就是如果域名后面不带具体的目录或者文件名,例如(https://www.phpnanshen.com/),就会默认执行网站的首页文件。服务器软件都有专门设置默认首页的地方,比如Apache里配置文件
默认先去执行index.html,没有依次往下找。
楠神在网站根目录添加一个index.php文件
直接输入域名:
可以访问到这个index.php文件,此时变量$_SERVER['REQUEST_URI']的值是“/”。
一、只用PHP实现URL重写
“?”在网址中主要起到传参数的作用,在https://www.phpnanshen.com/后面加个“?”,后面随便输入字符串,看结果:
通过$_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。
正则表达式是程序员都必须要了解,要会的东西。
楠神定义的依靠正则表达式获取网址里的“/?”与“.html”之间的数字
看效果:
获取到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行如果有“#”注释,请去掉。
楠神推荐的PHPstudy集成开发软件默认是打开重写模块的。
2、在网站根目录放置.htaccess文件,里面的内容:
在浏览器输入:
“/”与“.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特殊符号及编码
网址URL中除了数字和字母表示文件和文件夹,还有这些字符的存在。有兴趣的可去网上搜搜各自的作用。