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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 最近工作遇到关于把长连接变成短连接的问题,于是想起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>

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

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


目录
相关文章
|
1天前
url重写重定向所有http网址到https网址
url重写重定向所有http网址到https网址
10 4
|
17天前
|
设计模式 存储 安全
PHP中单例模式的深入解析与实践指南
在PHP开发领域,设计模式是构建高效、可维护代码的重要工具。本文聚焦于单例模式——一种确保类仅有一个实例,并提供全局访问点的模式。我们将从理论出发,探讨单例模式的基本概念、应用场景,并通过实际案例分析其在PHP中的实现技巧。最后,讨论单例模式的优势、潜在缺陷及如何在实际项目中合理运用。
|
2月前
|
消息中间件 开发者
【RabbitMQ深度解析】Topic交换器与模式匹配:掌握消息路由的艺术!
【8月更文挑战第24天】在消息队列(MQ)体系中,交换器作为核心组件之一负责消息路由。特别是`topic`类型的交换器,它通过模式匹配实现消息的精准分发,适用于发布-订阅模式。不同于直接交换器和扇形交换器,`topic`交换器支持更复杂的路由策略,通过带有通配符(如 * 和 #)的模式字符串来定义队列与交换器间的绑定关系。
47 2
|
2月前
|
域名解析 负载均衡 网络协议
DNS重定向
【8月更文挑战第16天】
100 1
|
2月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
92 12
|
2月前
|
开发者 云计算 数据库
从桌面跃升至云端的华丽转身:深入解析如何运用WinForms与Azure的强大组合,解锁传统应用向现代化分布式系统演变的秘密,实现性能与安全性的双重飞跃——你不可不知的开发新模式
【8月更文挑战第31天】在数字化转型浪潮中,传统桌面应用面临新挑战。本文探讨如何融合Windows Forms(WinForms)与Microsoft Azure,助力应用向云端转型。通过Azure的虚拟机、容器及无服务器计算,可轻松解决性能瓶颈,满足全球用户需求。文中还提供了连接Azure数据库的示例代码,并介绍了集成Azure Storage和Functions的方法。尽管存在安全性、网络延迟及成本等问题,但合理设计架构可有效应对,帮助开发者构建高效可靠的现代应用。
23 0
|
2月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
81 0
|
2月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
31 0
|
2月前
|
SQL 安全 数据库
|
2月前
|
数据处理 开发者
深入解析Angular服务:构建可重用业务逻辑的最佳实践与模式——从基础创建到高级异步处理的全面指南
【8月更文挑战第31天】在Angular开发中,服务用于封装可重用的业务逻辑,有助于保持代码的DRY原则。本文详细介绍如何创建和使用服务,包括基础设置、逻辑封装及高级应用,如HTTP请求和异步数据处理,帮助你构建模块化、易维护的应用。通过示例展示,你将学会如何充分利用服务提升开发效率。
28 0

推荐镜像

更多