使用 .htaccess 重写规则时 PHP 函数 file_exists 不起作用

Posted

技术标签:

【中文标题】使用 .htaccess 重写规则时 PHP 函数 file_exists 不起作用【英文标题】:PHP function file_exists not working when using .htaccess rewrite rule 【发布时间】:2017-02-21 11:22:18 【问题描述】:

我在我的 .htaccess 文件中使用以下内容

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f

RewriteRule ^shopping-bag/?$ shoppingbag.php [L,QSA]

这会改变网址

http://www.domain.com/foldername/shoppingbag.php

www.domain.com/foldername/shopping-bag/

我所有的内容都放在了

/www/文件夹名/

我通过声明一个值为 http://www.domain.com/foldername/ 的全局变量来修复所有 css 和 js 文件,并将此变量放在 css 和 js 文件的路径之前。由于 file_exists 不适用于 URL,我尝试执行以下操作

../uploads/image.jpg

图片文件的实际路径是

/www/foldername/uploads/image.jpg

我试过了

var_dump(../uploads/image.jpg)

http://www.domain.com/foldername/shopping-bag/

但是没有用。而且我不想使用<base href="">

【问题讨论】:

<base href="http://www.domain.com/foldername/"> 呢? 我认为那部分没有代码标签。我不想使用基本 href I fixed all the css 也不是最好的方法,但这只是我的评论:) 哦,对不起,我不是故意冒犯你的。我只是说我不想使用 base href 是因为我遇到了一些问题 在禁用缓存的情况下在 Chrome 开发工具中进行测试,并在“网络”选项卡中检查您为 css/js/images 获得的 404 URL 是什么。 【参考方案1】:

除非您使用 chdir( $someDir ) 之类的东西更改了 PHP 的当前工作目录,否则所有文件系统函数的行为基本上都应相对于当前脚本的目录。

在您的情况下,file_exists( 'uploads/image.jpg' )file_exists( './uploads/image.jpg' )(注意单点,表示当前目录)因此应返回 true,如果文件实际存在于您所说的位置。

注意<base href=""> 与PHP 脚本无关,因为PHP 是一种服务器端 语言,而<base> 是一种客户端 html 元素。

要更好地了解服务器端和客户端(编程)之间的区别,请查看this answer,例如。

此外,除非您打算展示不同的东西,否则var_dump(../uploads/image.jpg) 不会输出任何有意义的东西。你不能像那样使用var_dump(),但也许你已经意识到了这一点。

【讨论】:

【参考方案2】:

foldername/shoppingbag.php 是您正在运行的文件,foldername/uploads/image.jpg 是它感兴趣的文件。相对路径应该是 uploads/image.jpg

这有什么作用?

var_dump('uploads/image.jpg');

【讨论】:

以上是关于使用 .htaccess 重写规则时 PHP 函数 file_exists 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 $_GET 中使用转义 & 符号的 htaccess 重写规则失败

如果我使用.htaccess mod重写规则,PHP Cookie不可用

PHP/Apache:用 .htaccess 重写规则

PHP中查询字符串的HTACCESS重写规则

.htaccess使用无限参数重写规则

htaccess 单参数重写规则