搜索
首页后端开发php教程一起聊聊PHP的路由与伪静态应用

本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于路由与伪静态应用的相关内容,路由是指线路分发,伪静态就是让动态的url地址看起来是静态的地址,下面一起来看一下,希望对大家有帮助。

一起聊聊PHP的路由与伪静态应用

路由

字面上解释,路是线路,道路;由,缘由,指意,表示规则;所以意思就是按照什么规则,或者意义,被指派到什么地方去。

所以路由是指线路分发,在后端web中一般都是指访问url的映射规则,比如什么样的url访问,经过路由规则映射到什么模块,什么控制器,什么方法,或者是类,或者是闭包,或者是别的,总之它是起分发的作用。

伪静态

伪静态字面上的意思就是伪造,静态。

(补充:伪静态就是让动态的URL地址看起来是静态的地址,伪静态是最终的目的,而不是技术。实现伪静态有很多方式去实现,利用主机的URL重写可以实现,利用程序本身的路由配置也可以实现,比如tp5和wordpress中可以自由的配置URL规则。前者需要有管理主机的权限,而后者比较灵活。但是要隐藏入口需要pathinfo或url重写的支持)

web2.0的世界里面,很多页面都是动态的,比如很多 index.php/a/…… 或者 index.php?a=1&…… 这样的,这样的动态地址不怎么好看,对搜索引擎不友好,所需需要借助一些技术手段来将这些动态的url地址伪装成静态的url地址,这就是伪静态。

所以伪静态指的是利用一些技术将动态地址转换成静态地址并可照常访问的解决方案,并不是指某一种技术。

那么来看下实现伪静态需要用到哪些技术:

  • web主机rewrite模块(URL重写,rewrite翻译成中文为重写,但很多人也常称伪静态)

  • pathinfo (主机支持的一种技术,index.php/path,再利用url重写可以隐藏入口)

  • 程序的路由(可以美化,缩短url,变得更人性化,更有语义)

补充:还有一个很重要的一点没提到的就是【加后缀】,这个不算是什么技术,所以没列到上面的技术列表中,加后缀可以在上面每一步都能完成,程序中就是控制url生成时加后缀就可以了。并且后缀有时候设计API时还很有用,必须后缀可以代表返回的数据格式(参考:REST设计风格)。

分析:

  • 第一种方案优点是功能强大(利用重写模块规则支持正则匹配等特性),可以实现任意的url重写,但缺点是需要配置很多复杂的url重写规则(多多返利程序就是利用这方式做伪静态,如果开启伪静态,则程序会生成伪静态规则的url,并且需要主机同时手动配置相应的url重写规则),需要有主机管理的权限,如果是在主机上修改的配置则需要重启web服务器(支持.htaccess则不需要重启)。

  • 这个需要web主机的支持,支持PATHINFO的主机可以支持 index.php/home/index/index 这样的url访问,这样web语言中就可以获得值(比如PHP程序可以得到 $_SERVER['PATH_INFO'] = '/home/index/index' )。根据这个特性,利用URL重写,只需要一条简单的URL重写规则,将所有参数都重写到入口文件的后面,这样就能实现隐藏入口文件了,当然这只是隐藏入口文件,在thinkphp中如果主机不支持PATHINFO(比如低版本的nginx)那么使用兼容模式(?s=/m/c/a)也能模拟实现pathinfo从而实现隐藏入口文件index.php

  • 可以说是程序里面的url重写(上面提到的rewrite是主机的URL重写),设计参考了主机的url重写,所以路由规则也和主机url重写规则差不多。优点是功能强大,规则配置灵活;缺点就是解析的性能问题(就这一个缺点,其它都是优点)。(WordPress自定义url其实就是用的自定义路由)

总结:

一般主机都能开启rewrite模块/功能支持URL重写,这很关键,这样实现隐藏入口文件了,这是第一步,再利用pathinfo(或者兼容模式),还有程序的路由,这样配合起来就能够实现简洁明了的URL地址了,也就是实现我们所说的伪静态。

扩展知识

原始的 index.php?m=home&c=index&a=index 实在是太难看了,所以即使不全伪静态,不用路由,也最好抛弃这种原始的地址,因为有些接口开发中已经不支持使用这类url地址了,所以务必使用 pathinfo 的形式:index.php/home/index/index,在隐藏入口,再加个后缀 home/index/index.html 就完美了,如果是做API或者有特殊用途的话还可以带上特定的后缀,比如看云、github仓库克隆时代.git后缀的仓库地址。

其实如果你的入口是index.php,使用兼容模式也可以隐藏入口的,直接?s=/m/c/a,?m=home&c=index&a=index 因为大多主机默认配置的有默认访问文件/入口。

下面分析nginx的部分配置:

主配置:/usr/local/nginx/conf/nginx.conf

user www www;worker_processes auto;error_log /data/wwwlogs/error_nginx.log crit;pid /var/run/nginx.pid;worker_rlimit_nofile 51200;events {
    use epoll;
    worker_connections 51200;
    multi_accept on;
    }

http {
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 1024m;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 120;
    server_tokens off;
    tcp_nodelay on;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #Gzip Compression
    gzip on;
    gzip_buffers 16 8k;
    gzip_comp_level 6;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_vary on;
    gzip_types
        text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
        text/javascript application/javascript application/x-javascript
        text/x-json application/json application/x-web-app-manifest+json
        text/css text/plain text/x-component
        font/opentype application/x-font-ttf application/vnd.ms-fontobject
        image/x-icon;
    gzip_disable "MSIE [1-6].(?!.*SV1)";

    #If you have a lot of static files to serve through Nginx then caching of the files' metadata (not the actual files' contents) can save some latency.
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;######################## default ############################
    server {
    listen 80;
    server_name _;
    access_log /data/wwwlogs/access_nginx.log combined;
    root /data/wwwroot/default;
    index index.html index.htm index.php;
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
        }
    location ~ [^/].php(/|$) {        #fastcgi_pass remote_php_ip:9000;
        fastcgi_pass unix:/dev/shm/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
        }
    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
        expires 30d;
        access_log off;
        }
    location ~ .*.(js|css)?$ {
        expires 7d;
        access_log off;
        }
    }########################## vhost #############################
    include vhost/*.conf;}

每一个虚拟主机在虚拟主机配置目录都有一个对应的配置文件

[root@iZuf6fvttmu9vkdbnencgpZ vhost]# lsdingtalk.uogo8.com.conf  lipin.uogo8.com.conf  tv.uogo8.com.conf
gj.uogo8.com.conf        test.uogo8.com.conf   www.uogo8.com.conf

虚拟主机配置文件:/usr/local/nginx/conf/vhost/www.uogo8.com.conf

server {
listen 80;
server_name www.uogo8.com uogo8.com;
access_log /data/wwwlogs/www.uogo8.com_nginx.log combined;
index index.html index.htm index.php;
include /usr/local/nginx/conf/rewrite/www.uogo8.com.conf;
root /data/wwwroot/www.uogo8.com;if ($host != www.uogo8.com) {
    rewrite ^/(.*)$ $scheme://www.uogo8.com/$1 permanent;
    }

location ~ .php {    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi_params;    set $real_script_name $fastcgi_script_name;        if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {        set $real_script_name $1;        #set $path_info $2;
        }
    fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
    fastcgi_param SCRIPT_NAME $real_script_name;    #fastcgi_param PATH_INFO $path_info;
    }
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
    expires 30d;
    access_log off;
    }
location ~ .*.(js|css)?$ {
    expires 7d;
    access_log off;
    }
}

伪静态单独放一个目录,需要时被虚拟主机配置文件引入,这样方便管理

[root@iZuf6fvttmu9vkdbnencgpZ vhost]# cd ../rewrite/[root@iZuf6fvttmu9vkdbnencgpZ rewrite]# lsnone.conf  thinkphp.conf  www.uogo8.com.conf

伪静态是一种效果,准确的说这是主机的URL重写规则/配置文件。但一般大家也习惯性称之为伪静态配置、伪静态文件,开启伪静态,伪静态模块,伪静态功能了,其实伪静态只是最终实现的效果。

thinkphp程序的伪静态配置文件:/usr/local/nginx/conf/rewrite/thinkphp.conf

location / {
    if (!-e $request_filename) {        # 不支持pathinfo,那就使用url重写,重写成兼容模式,来达到隐藏入口的效果
        rewrite ^(.*)$ /index.php?s=$1 last;
        break;
    }
}

thinkphp伪静态配置文件.htaccess(Apache环境)

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f  # 直接利用url重写,重写成 pathinfo 模式
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

uogo8的伪静态配置文件:/usr/local/nginx/conf/rewrite/www.uogo8.com.conf

location / {    if (!-e $request_filename) {
        rewrite  ^/(.*)$  /index.php/$1  last;        break;
    }
}
########################################################################       OneinStack for CentOS/RadHat 5+ Debian 6+ and Ubuntu 12+      ##       For more information please visit https://oneinstack.com      ########################################################################Your domain:                  www.uogo8.com
Virtualhost conf:             /usr/local/nginx/conf/vhost/www.uogo8.com.conf
Directory of:                 /data/wwwroot/www.uogo8.com
Rewrite rule:                 /usr/local/nginx/conf/rewrite/thinkphp.conf

推荐学习:《PHP视频教程

以上是一起聊聊PHP的路由与伪静态应用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:掘金。如有侵权,请联系admin@php.cn删除
PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:深入了解他们的历史PHP和Python:深入了解他们的历史Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在PHP和Python之间进行选择:指南在PHP和Python之间进行选择:指南Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP和框架:现代化语言PHP和框架:现代化语言Apr 18, 2025 am 12:14 AM

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHP的影响:网络开发及以后PHP的影响:网络开发及以后Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP与Python:用例和应用程序PHP与Python:用例和应用程序Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

See all articles

热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.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器