求与奴隶的生活安卓2.0版本

thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
本章节:详细介绍thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成
一、URL规则
1、默认是区分大小写的
2、如果我们不想区分大小写可以改配置文件
'URL_CASE_INSENSITIVE'=&true,//url不区分大小写
*模块命名太长的情况:
A、如果模块名为 UserGroupAction,复杂模块(一般是IndexAction)
那么url找模块就必要要写成
http://localhost/thinkphp4/index.php/user_group/index
B、如果'URL_CASE_INSENSITIVE'=&false(区分大小写的情况可以访问)
那么url也可以写为
http://localhost/thinkphp4/index.php/UserGroup/index
二、URL伪静态(tp默认支持伪静态)
http://localhost/thinkphp4/index.php/UserGroup/index.xml
*默认pdo、html、xml...都是支持的,如果要限制加个配置就行
'URL_HTML_SUFFIX'=&'html|shtml|xml',//限制伪静态的后缀
三、URL路由
1、启动路由
要在配置文件中开启路由支持
'URL_ROUTER_ON' =& true, //开启路由
2、使用路由
1.规则表达式配置路由
'URL_ROUTER_ON' =& true, //开启路由
'URL_ROUTE_RULES' =& array(
'my'=&'Index/index',//静态地址路由 访问:http://localhost/thinkphp/index.php/my
':id/:num'=&'Index/index',/*后面的数字值随便写,字母也行
动态地址路由 访问:http://localhost/thinkphp/index.php/10/200
可以再模块控制器中用get方式传值 或 获取
echo $_GET['id'];
echo $_GET['num'];
'my/:num'=&'Index/index', //动静混合地址路由 http://localhost/thinkphp/index.php/my/200
'year/:year/:month/:date'=&'Index/index',//动态和静态混合地址路由: http://localhost/thinkphp/index.php/year/
'year/:year\d/:month\d/:date\d'=&'Index/index',//动态和静态混合地址路由 --加上 \d代表类型只能是数字
'my/:id$'=&'Index/index',// 加上$说明地址中只能是 my/1000 后面不能有其他内容了
2.正则表达式配置路由
//http://localhost/thinkphp/index.php/year/
'/^year\/(\d{4})\/(\d{2})\/(\d{2})/'=&'Index/index?year=:1&month=:2&date=:3'
3、注意事项:
1.越复杂的路由越往前面放
'URL_ROUTE_RULES'=&array(
'my/:year/:month:/:day'=&'Index/day', *复杂的路由放在前面,放后面就不会执行
'my/:id\d'=&'Index/index',
'my/:name'=&'Index/index',
2.可以使用$作为完全匹配的路由规则(不管复杂否,都会匹配所有正则)
'URL_ROUTE_RULES'=&array(
'my/:id\d$'=&'Index/index',
'my/:name$'=&'Index/index',
'my/:year/:month:/:day$'=&'Index/day',
3.用正则匹配的方式
'URL_ROUTE_RULES'=&array(
'/^my\/(\d+)$/'=&'Index/index?id=:1',
'/^my\/(\w+)$/'=&'Index/index?name=:1',
'/^my\/(\d{4})\/(\d{2})\/(\d{2})$/'=&'Index/day?year=:1&month=:2&day=:3',
四、URL重写
比如:http://localhost/thinkphp/index.php/Index/index.html/t/my ---- 不想让index.php出现
下面是Apache的配置过程,可以参考下:
1、httpd.conf配置文件中加载了mod_rewrite.so模块
2、AllowOverride None 将None改为 All
3、确保URL_MODEL设置为2 (该步骤省略)
4、把下面的内容保存为.htaccess文件放到入口文件的同级目录下
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
重启Apache之后,原来的
就可以通过访问
http://localhost/thinkphp/Index/index.html/t/my --简化了URL地址,对SEO的支持度好点
五、URL生成(手册有详细介绍)
public function url(){
echo U('Index/add'); // 生成Index模块的add操作的URL地址
///thinkphp/index.php/index/add
上一篇/index.php?m=content&c=content&a=public_preview&steps=1&catid=75&id=363637在Win2003服务器系统IIS6.0环境下ISAPI_Rewrite的ThinkPHP框架URL伪静态规则
hinkPHP系统网站配置情况:
通常的URL里面含有index.php,为了达到更好的SEO效果可能需要去掉URL里面的index.php
,通过URL重写的方式可以达到这种效果,通常需要服务器开启URL_REWRITE模块才能支持。
'URL_DISPATCH_ON'=&true,
'URL_MODEL'=&2,&&
//开启了Rewrite,隐藏了index.php
首先是给iis 加上php 扩展(这就不赘述了),下载
ISAPI_Rewrite&& 并安装,然后给iis
加上该扩展,最关键是的 httpd.ini的配置信息了。也就是映射规则。
下面是我的Rewrite规则:
[ISAPI_Rewrite]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Block external access to the httpd.ini and httpd.parse.errors
RewriteRule /httpd(?:\.ini|\.parse\.errors).* / [F,I,O]
# Block external access to the Helper ISAPI Extension
RewriteRule .*\.isrwhlp / [F,I,O]
---------------------------以下为ISAPI_Rewrite仿盗链规则-----------------------------
#根据需要将允许访问的域名按下面例子添加即可。
#可根据需要自行设置需要防盗链的文件后缀。
#/block.html为盗链替换的网页,可以设置版权提醒。
# For version 2.x
# RewriteCond Host: ^(.+)$
# RewriteCond Referer: ^(?!http://\1.*).*$
# RewriteCond Referer:
^(?!http://(.*.|.*.|.*.g.cn).*).*$
# RewriteRule ^.*.(?:gif|jpg|jpeg|png|bmp|exe|rar|zip|mp3|wma)$
/block.html [I,O,N]
# For version 2.x
# RewriteCond Host: ^(.+)$
# RewriteCond Referer: ^(?!http://\\1.*).*$
# RewriteCond Referer:
^(?!http://(.*\.baidu\.com|.*\.google\.com|.*googlebot\.com).*).*$
# RewriteRule ^.*\.(?:gif|jpg|jpeg|png|bmp|exe|rar|zip)$ /block.gif
# For version 3.x
# RewriteCond %{HTTP:Host} ^(.+)$
# RewriteCond %{HTTP:Referer} ^(?!http://\\1.*).*$
# RewriteCond %{HTTP:Referer}
^(?!http://(.*\.baidu\.com|.*\.google\.com|.*googlebot\.com).*).*$
# RewriteRule ^.*\.(?:gif|jpg|jpeg|png|bmp|exe|rar|zip)$ /block.gif
-------------------------------------------------------------------------------------
# IIS Rewrite
RewriteCond Host:
(?:www|game)\.oceanpark\.com&&
//ISAPI_Rewrite筛选对域名起作用
RewriteRule
(?!/index.php)(?!/admin.php)(?!/navi.xml)(?!/wwwroot)(?!/game)(?!/uc)(?!/Scripts)(?!/Uploads)(?!/Public)(?!/Common)(.*)$
/index\.php\?s=$1 [I]
//排除index.admin.UPCommon等实际存在的文件及目录,或者添加以下规则也可以。
# RewriteRule
^(?!/index.php)(?!/admin.php)(?!/navi.xml)(?!/wwwroot)(?!/game)(?!/uc)(?!/Scripts)(?!/Uploads)(?!/Public)(?!/Common)(.*)$
/index.php/$1 [L]
····································································································································································
在Apache上开发的,.htaccess内容与TP手册中的一样,但IIS使用httpd.ini,并且规则不一样。
IIS对于Rewrite规则
RewriteRule (.*)$ /index\.php\?s=$1 [I]
的解释是,不管什么样的请求URL,都重写到index.php入口文件
而Apache与IIS不一样的地方是,对于规则
&IfModule mod_rewrite.c&
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=/$1 [QSA,PT,L]
&/IfModule&
它对于请示的路径会做一些判断,当请求URL是一个存在的文件路径时,则不重写向index.php(本人对于URL
REWRITE 中的REGEXP也不是很熟悉,难道APACHE的这行规则中有什么悬机?)
所以,使用了URL 重写,并且规则只有一条"将所有请求转向index.php",在APACHE下,
Public目录仍然可以访问(里面可是CSS,JS和图片啊!),而到了IIS下则图片,CSS,JS都加载不进行,并且输入
/Public/ ,出现的错误是 没有Public这个模块!
解决方法是,IIS的重写规则不能简单的只指向index.php,需要使用正则表达的前瞻功能,排除指定路径,下面是我的网站的httpd.ini文件,
其中,Ask目录为一个问吧系统的路径,BBS是论坛的路径
[ISAPI_Rewrite]
RewriteRule (?!/ask)(?!/bbs)(?!/Public)(?!/Common)(.*)$
/index\.php\?s=$1 [I]
如果还要排除其它目录的话,只要将(?!/目录名)加在前面就行了
另外,IIS对于重写后的REQUEST_URI的解析也与Apache不一样,如果使用了重写,IIS不会将在地址栏中的URL记为REQUEST_URI,而是重写后的URI
如下面的URL
/pro/show/id/1.htm
RewriteRule (.*)$ /index\.php\?s=$1 [I]
本来是执行Pro模块的show方法,为1,在Pro模块中获取REQUEST_URI,值应为/pro/show/id/1.htm
但在IIS中是 /index.php?s=/pro/show/id/1.htm
解决这个问题的方法之前也有了,在国外一个网站上看到的
//ISAPI_Rewrite 3.x
if (isset($_SERVER['HTTP_X_REWRITE_URL'])){
$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];
//ISAPI_Rewrite 2.x w/ HTTPD.INI configuration
else if (isset($_SERVER['HTTP_REQUEST_URI'])){
$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
//Good to go!
//ISAPI_Rewrite isn't installed or not configured
//Someone didn't follow the instructions!
if(isset($_SERVER['SCRIPT_NAME']))
$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['SCRIPT_NAME'];
$_SERVER['HTTP_REQUEST_URI'] = $_SERVER['PHP_SELF'];
if($_SERVER['QUERY_STRING']){
$_SERVER['HTTP_REQUEST_URI'] .= '?' .
$_SERVER['QUERY_STRING'];
//WARNING: This is a workaround!
//For guaranteed compatibility, HTTP_REQUEST_URI or
HTTP_X_REWRITE_URL *MUST* be defined!
//See product documentation for instructions!
$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_REQUEST_URI'];
上面的代码引入的话,即可解决IIS的REQUEST_URI方法(如果对于THINKPHP,其实上面的URL还有更简单的方法)
$_SERVER['REQUEST_URI']=$_GET['s'];
//直接将QS中的s变量赋值给$_SERVER['REQUEST_URI']就行了
上面已经解决了不少问题,但最后一个问题就是,也是我一直没有解决好的问题
对于下面的URL&&
/pro/branch/air.htm?pclass=gree
在APACHE下面,可以获取到GET变量 pclass的值,并且branch变量的值为air(开启了伪静态),而在IIS下,branch值就不正确了,而pcalss则获取不到了
解决方法只有使用
/pro/branch/branch/air/pclass/gree这类的URL
或者自己在程序中重新解析URL。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 云参会2.0.0版本安卓 的文章

 

随机推荐