利用apache特性, 分析调试http伪静态

许多开发者都碰到一个问题, 伪静态应该怎么写? 怎么来调试语法是否正确. 比如"xxx.com/aa/bb/cc/dd", 这段非常明显的伪静态, 可在访问时却报404错误. 但作为开发者, 你未必知道为什么会报404, 原因在哪. 本篇文章即介绍如何调试伪静态, 如何分析伪静态, 再也不会为伪静态烦恼.

(以下内容仅适用于apache模块)
首页我们建立一个伪静态识别文件: .htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index_redirect.php?$1 [L]

一段非常简单的伪静静态写法, 当url无法请求到文件时, 全部跳转至index_redirect.php文件上, 所有参数都挂在?号后面, 也就是 index_redirect.php?aa/bb/cc/dd 类似的映射.


然后在建立一个测试php文件: test.php

<?php
echo '<pre>';
$urls = urlencode('~!@#$%^&*()_+{}:"|?><.,;&*]['); // 不能传递 "/\",

url_reg("postr/aa/{$urls}/"); // 顺便对符号在伪静态某段中的兼容性进行测试.

function url_reg($urlstr){  
    echo '<span style="color:red">test url : '.$urlstr.'</span><br />';
    $info  = (array) apache_lookup_uri($urlstr);
    foreach ($info AS $name  =>  $value ) {
        $name = str_pad($name, 14,' ', STR_PAD_RIGHT);
        echo  "$name :  $value <br />" ;
    }
    echo '<br />';
}
运行之后返回值如下:
test url : postr/b%2Css/%7E%21%40%23%24%25%5E%26%2A%28%29_%2B%7B%7D%3A%22%7C%3F%3E%3C.%2C%3B%EF%BC%86%EF%BC%8A%5D%5B/
status         :  200 
the_request    :  GET /test.php HTTP/1.1 
method         :  GET 
mtime          :  -674244178 
clength        :  0 
chunked        :  0 
handler        :  redirect-handler 
no_cache       :  0 
no_local_copy  :  1 
unparsed_uri   :  /postr/b%2Css/%7E%21%40%23%24%25%5E%26%2A%28%29_%2B%7B%7D%3A%22%7C%3F%3E%3C.%2C%3B%EF%BC%86%EF%BC%8A%5D%5B/ 
uri            :  /postr/b,ss/~!@#$%^&*()_+{}:"|?><.,;锛嗭紛][/ 
filename       :  redirect:/index_redirect.php 
path_info      :  /b,ss/~!@#$%^&*()_+{}:"|?><.,;锛嗭紛][/ 
args           :  postr/b,ss/~!@#$%^&*()_+{}:"|?><.,;锛嗭紛][/ 
allowed        :  0 
sent_bodyct    :  0 
bytes_sent     :  0 
request_time   :  1385607846


最主要是filename,path_info  两段, 其中filename 表示被映射在哪个文件上, 执行的文件. path_info也就是真实的请求数据.

接着我们需要试验伪静态有些什么规律, 如discuz用的 tid-1212.html这类, 还有框架型的/aa/bb/cc这种目录型. 还有些人喜欢用tid.12.html链式.

url_reg("test/a/b/");
url_reg("motest-a-b-c");
url_reg("a.b.c.s");

我们分析一段正常的url

url_reg("test.php?a=b");



返回的结果:

test url : test.php?a=b
status         :  200 
the_request    :  GET /test.php HTTP/1.1 
method         :  GET 
mtime          :  0 
clength        :  0 
chunked        :  0 
content_type   :  text/html 
handler        :  application/x-httpd-php 
no_cache       :  0 
no_local_copy  :  1 
unparsed_uri   :  /test.php?a=b 
uri            :  /test.php 
filename       :  D:/xampps/htdocs/test.php 
args           :  a=b 
allowed        :  0 
sent_bodyct    :  0 
bytes_sent     :  0 
request_time   :  1385609222 

可以看得到: handler不再是redirect, 也就是这段url没有应用到伪静态. filename的值也没有 redirect字样. args值已经识别了正常的get数据.
所以我们可以通过这儿的判断, 知道链接是否已经伪静态, 是否符合我们的要求.





伪静态一些规律:

1: 不能传递/\%三个符号, 你可以直接试试.

2: 伪静态数据段, 默认仅对http安全字符进行反转义, 如%2c转换成,这样, +号不会转换为空. 这在php get上是有区别的.

3: index/aa/bb/cc 当index.php文件存在时, 将直接访问index.php, 第一段被当成文件名了. (比较奇怪)



End;


你可能感兴趣的:(apache,伪静态)