使用 .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 重写规则失败