URL解析的几种模式以及拟静态重定向问题

简介: 最近工作遇到关于把长连接变成短连接的问题,于是想起tp里面的几种url解析模式:原文很经典:现在摘录原文; URL模式 ThinkPHP框架基于模块和操作的方式进行访问,由于ThinkPHP框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过URL的参数来访问和执行。

最近工作遇到关于把长连接变成短连接的问题,于是想起tp里面的几种url解析模式:原文很经典:现在摘录原文;

URL模式

ThinkPHP框架基于模块和操作的方式进行访问,由于ThinkPHP框架的应用采用单一入口文件来执行,因此网站的所有的模块和操作都通过URL的参数来访问和执行。这样一来,传统方式的文件入口访问会变成由URL的参数来统一解析和调度。

ThinkPHP强大的URL解析、调度以及路由功能为这个功能实现提供了有力的保证,并且可以在绝大多数的服务器环境里面部署成功。

ThinkPHP支持的URL模式包括普通模式、PATHINFO模式、REWRITE模式和兼容模式,并且都提供路由支持。默认为PATHINFO 模式,提供最好的用户体验和搜索引擎友好支持。

例如普通模式下面的URL为:

http://localhost/appName/index.php?m=moduleName&a=actionName&id=1


如果使用PATHINFO模式的话,URL成为:

http://localhost/appName/index.php/moduleName/actionName/id/1/

PATHINFO模式对以往的编程方式没有影响,GET 和POST方式传值依然有效,因为系统会对PATHINFO 方式自动处理,例如上面URL地址中的id的值可以通过 $_GET['id'] 的方式正常获取到。


如果使用REWRITE模式,通过配置URL可以成为:

http://localhost/appName/moduleName/actionName/id/1/

例如上面生成的myApp项目如果我们通过下面的URL访问:

http://localhost/myApp/

其实是定位到myApp项目的Index模块的index操作,因为系统在没有指定模块和操作的时候,会执行默认的模块和操作,这个在ThinkPHP的惯例配置里面是Index模块和index操作。因此下面的URL和上面的结果是相同的:

http://localhost/myApp/index.php/Index/index/

通过项目配置参数,我们可以改变这个默认配置。

系统还支持分组模式和URL路由的功能,这些都能够带来URL的不同体验。

四、兼容模式: 设置URL_MODEL 为3

兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序。兼容模式URL可以支持任何的运行环境

兼容模式的效果是:

http://<serverName>/appName/?s=/module/action/id/1/

并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:

http://<serverName>/appName/?s=module~action~id~1

其实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。

某些服务器环境不能良好的支持PATHINFO,或者需要进行额外的配置才可以支持,如果你确认你的服务器环境不支持PATHINFO,可以选择普通模式或者兼容模式URL运行。

*******************************************************************************************************************************************************************************

现在需要解决的问题是:http://www.moredoo.com/podcast/rooms/play_history.php?roomid=12465363&v=a88cad8d61fc2ab23c6d05486b8fe27d&v_id=1166这个太长,如何做的短一些 提供的几种思路做成//www.moredoo.com/index.php/12465363/a88cad8d61fc2ab23c6d05486b8fe27d/1166

做法是在根目录也就是和podcast文件夹同级的地方新建一个index.php文件,作用是访问www.moredoo.com的时候(实际上也是访问index.php),index.php根据系统函数$_SERVER['PHP_SELF']获得相应的url的值,再根据后面的参数进行判断和跳转,

实际上index.php看起来还是多此一举,能不能把index.php也省略了呢?根据上面提供的几种url解析模式,我们可以使用rewrited把index.php文件隐藏起来,变成www.moredoo.com/12465363/a88cad8d61fc2ab23c6d05486b8fe27d/1166,这样是不是更简洁些呢。

----------------------------------------------------------------**********************************************************************************************************

rewrited的配置:

Apache 配置:
支持 httpd.conf  配置和目录  .htaccess 配置
启用 rewrite
# LoadModule rewrite_module modules/mod_rewrite.so
去除前面的  #
LoadModule rewrite_module modules/mod_rewrite.so
启用 .htaccess
AllowOverride None     修改为:   AllowOverride All



1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接 安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。

基于服务器级的(httpd.conf)有两种方法,

一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;

另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。


基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
3.Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi 
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

URL重定向实例

例子一:(通过访问前面的A跳转到后面的B)

1.http://www.zzz.com/xxx.php-> http://www.zzz.com/xxx/ 
2.http://yyy.zzz.com-> http://www.zzz.com/user.php?username=yyy 的功能 
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^www.zzz.com 
RewriteCond %{REQUEST_URI} !^user\.php$ 
RewriteCond %{REQUEST_URI} \.php$ 
RewriteRule (.*)\.php$ http://www.zzz.com/$1/ [R] 
RewriteCond %{HTTP_HOST} !^www.zzz.com 
RewriteRule ^(.+) %{HTTP_HOST} [C] 
RewriteRule ^([^\.]+)\.zzz\.com http://www.zzz.com/user.php?username=$1

例子二:

/type.php?typeid=*   --> /type*.html
/type.php?typeid=*&page=*   --> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]

例子三:隐藏index.php文件的

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

   在工作之中遇到的一个问题就是:写入的重定向配置不能正确生效,准确的说是在httpd.conf文件里面配置生效,但是在.htaccess文件不能生效,

查看文件总是发现

LoadModule rewrite_module     modules/mod_rewrite.so

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Deny from all
</Directory>

也都是开启的  但是无论怎么配置都是失效,参考官方手册发现:.htaccess的配置需要的条件:

第一是开启mod_rewrite:

LoadModule rewrite_module     modules/mod_rewrite.so

<Directory />
    Options FollowSymLinks
    AllowOverride All
    Order deny,allow
    Deny from all
</Directory>

第二步需要引入.htaccess (即把下面的 AllowOverride none 改成 AllowOverride All:作用开启引入.htaccess文件)

<Directory "/usr/local/apache/htdocs">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options -Indexes FollowSymLinks Includes


    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None


    #
    # Controls who can get stuff from this server.
    #
    Order allow,deny
    Allow from all


</Directory>

本次工作之中遇到的问题:发现配置问题 ,由于存在大量的无关信息 且配置是英文文档,导致自己不能静下心来详细的阅读和解决问题,当自己解决问题的时候,回头查看重定向的问题时候发现,开头的解释中就有关于两种方式的说明,只是自己粗心大意 自以为知道就没有细看,还有在本次问题中存在的排除问题

第一是要分析问题的几种可能(需要详细的查看文件)-----第二步排查问题(单因子控制变量法)------------缩小问题范围--------->找到问题核心所在------想办法解决 


目录
相关文章
|
22天前
|
域名解析 移动开发 负载均衡
阿里云DNS常见问题之DNS负载均衡调加权模式失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
29天前
|
网络协议 开发工具 Android开发
应用研发平台EMAS产品常见问题之接入httpdns后 访问重定向的url访问有问题如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
|
2月前
|
监控 API 开发者
Sentinel之道:流控模式解析与深度探讨
Sentinel之道:流控模式解析与深度探讨
48 0
|
3月前
|
SQL Java 数据库
深入解析MyBatis-Plus中静态工具Db的多种用法及示例
深入解析MyBatis-Plus中静态工具Db的多种用法及示例
103 0
|
3月前
|
存储 安全 JavaScript
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
在传统的客户端-服务器身份验证模式中,客户端请求服务器上访问受限的资源(受保护的资源)时,需要使用资源所有者的凭据在服务器上进行身份验证。资源所有者为了给第三方应用提供受限资源的访问权限,需要与第三方共享它的凭据。这就导致一些问题和局限:
372 2
【分布式技术专题】「授权认证体系」深度解析OAuth2.0协议的原理和流程框架实现指南(授权流程和模式)
|
8天前
|
存储 安全 测试技术
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
网络奇谭:虚拟机中的共享、桥接与Host-Only模式解析
15 0
|
25天前
|
Java 程序员 C#
静态构造方法解析,Java新手必看技能
静态构造方法解析,Java新手必看技能
8 0
|
1月前
|
存储 安全 区块链
NFT代币模式系统开发技术规则解析
随着区块链技术的飞速发展,NFT(非同质化代币)作为一种独特的数字资产,正在全球范围内掀起一股热潮。NFT不仅赋予了数字内容独一无二的身份标识,更让艺术品、游戏道具等虚拟物品具备了真实可交易的价值。本文将深入探讨NFT代币模式的系统开发源码,带您领略这一创新技术的魅力所在。
|
1月前
|
Python
URL解析函数
URL解析函数。
20 1
|
1月前
|
域名解析 缓存 网络协议
HTTP DNS的工作模式
【2月更文挑战第12天】
HTTP DNS的工作模式

推荐镜像

更多