我正在使用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”。
答案 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中。