最近工作遇到关于把长连接变成短连接的问题,于是想起tp里面的几种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访问:
其实是定位到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
rewrited的配置:做法是在根目录也就是和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,这样是不是更简洁些呢。
----------------------------------------------------------------**********************************************************************************************************
Apache 配置:
1、Rewrite规则简介:
基于服务器级的(httpd.conf)有两种方法,
一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;
另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
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>
<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>
本次工作之中遇到的问题:发现配置问题 ,由于存在大量的无关信息 且配置是英文文档,导致自己不能静下心来详细的阅读和解决问题,当自己解决问题的时候,回头查看重定向的问题时候发现,开头的解释中就有关于两种方式的说明,只是自己粗心大意 自以为知道就没有细看,还有在本次问题中存在的排除问题
第一是要分析问题的几种可能(需要详细的查看文件)-----第二步排查问题(单因子控制变量法)------------缩小问题范围--------->找到问题核心所在------想办法解决