php检查file_exists()是否与htaccess mod_rewrite

时间:2016-02-17 13:21:09

标签: php apache .htaccess redirect mod-rewrite

我正在使用htacces mod_rewrite来重写我的网站网址,例如:

/dir/file.php
/dir/file_example.php
/dir/file2.php?id=test

成为

/dir/file
/dir/file-example
/dir/file2-test

一切都好。现在我有一个PHP脚本来进行某些重定向,但在重定向之前我想检查文件(或url)是否存在:

if(file_exists("/dir/file2-test")){ // redirect on page
}else{ // redirect on index

但是在这种情况下file_exists()返回false。

还有另一种方法来检查这些页面/ url(file2-test,file-example等)是否通过php存在?

PS:由于我的htaccess规则的复杂性,我不可能在最后添加“.php”。

2 个答案:

答案 0 :(得分:1)

首先,你必须检查绝对路径,然后你必须添加文件扩展名(对于文件):

file_exists( $_SERVER['DOCUMENT_ROOT'].'/dir/file2-test.php') // check php file
file_exists( $_SERVER['DOCUMENT_ROOT'].'/dir/file2-test')     // check directory

或者,或许更好:

file_exists( $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI"].".php") // check php file
file_exists( $_SERVER['DOCUMENT_ROOT'].$_SERVER['REQUEST_URI"])        // check directory

但是 - 也可以使用细分和/或查询 - 您应该使用parse_url

$uri = parse_url( $_SERVER['REQUEST_URI'] );
file_exists( $_SERVER['DOCUMENT_ROOT'].$uri['path'].".php") // check php file
file_exists( $_SERVER['DOCUMENT_ROOT'].$uri['path'])        // check directory

编辑:

  

由于我的htaccess规则的复杂性,我不可能在最后附加“.php”。

尝试glob()

$uri = parse_url( $_SERVER['REQUEST_URI'] );
$files = glob( $_SERVER['DOCUMENT_ROOT'].$uri['path'].'*' );

现在在$files,您将拥有以$_SERVER['DOCUMENT_ROOT'].$uri['path']开头的所有文件

答案 1 :(得分:1)

可以检查该URL是否通过实际调用而存在,但代价是执行真正的http请求,其中包含由此引起的所有服务器负载和延迟。

$file = 'http://www.domain.com/dir/file2-test';
$file_headers = @get_headers($file);
if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
    $exists = false;
}
else {
    $exists = true;
}

来源:http://www.php.net/manual/en/function.file-exists.php#75064

我根本不推荐这个。

我没有看到任何从php探测RewriteEngine逻辑的真正机会,因此我建议将整个重写逻辑集成到htaccess或php中。