关于PATHINFO的重写规则解析
来源:互联网 发布:java电信计费系统 编辑:程序博客网 时间:2024/06/10 06:07
最近比较流行的框架比如laravel,yii国内的thinkphp都提供了以重定url的方式来实现pathinfo的url风格。
以thinkphp为例,提供了名为 "s"的get参数,只需要将路径重定向到这个参数上即可,比如nginx下:
location / {
if
(!-e $request_filename){
rewrite ^/(.*)
/index
.php?s=$1 last;
}
}
现在laravel和yii2的重写规则更加简单,仅仅需要:
location / {
try_files $uri $uri/
/index
.php?$args;
}
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php
当你访问一个无法访问的路径时,比如 localhost/Index/index 实际上在你的webroot目录是没有Index/index目录或Index/index.html文件的,这时候我们就需要让框架来处理请求,将/Index/index 这个路径交给框架,而框架唯一的入口就是localhost/index.php,所以我们只需要将该请求重写到这个url上就可以了。
当访问
localhost/index/index?a=1
时,会重定向到:
localhost/index.php?a=1
那么/index/index这个字符串哪去了?答案应该在一个环境变量$_SERVER['REQUEST_URI']或者类似的变量,让我们通过Yii2里面的一个函数来研究一下具体流程:
protected
function
resolveRequestUri()
{
if
(isset(
$_SERVER
[
'HTTP_X_REWRITE_URL'
])) {
// IIS
$requestUri
=
$_SERVER
[
'HTTP_X_REWRITE_URL'
];
}
elseif
(isset(
$_SERVER
[
'REQUEST_URI'
])) {
$requestUri
=
$_SERVER
[
'REQUEST_URI'
];
if
(
$requestUri
!==
''
&&
$requestUri
[0] !==
'/'
) {
$requestUri
= preg_replace(
'/^(http|https):\/\/[^\/]+/i'
,
''
,
$requestUri
);
}
}
elseif
(isset(
$_SERVER
[
'ORIG_PATH_INFO'
])) {
// IIS 5.0 CGI
$requestUri
=
$_SERVER
[
'ORIG_PATH_INFO'
];
if
(!
empty
(
$_SERVER
[
'QUERY_STRING'
])) {
$requestUri
.=
'?'
.
$_SERVER
[
'QUERY_STRING'
];
}
}
else
{
throw
new
InvalidConfigException(
'Unable to determine the request URI.'
);
}
return
$requestUri
;
}
这个方法应该是用获得重定向之前的url,也就是你浏览器地址栏中所显示的 /index/index?a=1 这个原始字符串。在nginx和apache中,默认的是$_SERVER['REQUEST_URI']而在iis中略有不同,比如$_SERVER['HTTP_X_REWRITE_URL']和$_SERVER['ORIG_PATH_INFO']。
好了,不管它处理过程,我们只要知道通过这个方法得到了原始url,然后我们可以根据这个url来解析pathinfo吧::
if
(!
empty
(
$_SERVER
[
'REQUEST_URI'
]))
{
$path
= preg_replace(
'/\?.*$/sD'
,
''
,
$_SERVER
[
'REQUEST_URI'
]);
}
- 关于PATHINFO的重写规则解析
- .htaccess重写规则解析
- Apache重写规则解析
- 使用PathInfo实现简单的URL重写
- 关于重载与重写的规则问题
- 让Nginx支持ThinkPHP的URL重写和PATHINFO
- Nginx兼容框架的pathinfo模式与URL重写
- Nginx兼容框架的pathinfo模式与URL重写
- 方法重写的规则
- .htaccess -------------的重写规则,
- .htaccess的重写规则
- .htaccess的重写规则
- YII的重写规则
- Java重写的规则
- 关于wdcp伪静态。pathinfo的配置。
- 关于C的声明规则解析
- php 解析pathinfo 类
- 重写equlas()方法的规则
- Xcode升级后插件失败解决方法
- 项目BUG总结
- mysql常用语句
- Java任意时间获得该时间所在周周一
- Maven详解之仓库------本地仓库、远程仓库
- 关于PATHINFO的重写规则解析
- ios後臺播放音樂
- iOS数组count操作(NSUInteger)的安全性
- Microsoft COM+组件接口的方法的重载问题。
- Codeforces Round #312 (Div. 2) C. Amr and Chemistry(技巧)
- java AJAX实现级联下拉框
- Linux虚拟机ftp客户端与Windows ftp服务器建立连接的方法
- 启动tomcat提示内存不足
- Android使用Ant自动编译签名打包详解