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;