这是一个问题,因为我目前的解决方案并不能让我满意以下问题:
我有一个自己的PHP框架,正在开发MVC模式。我的路由器工作得很完美,除了我有一个问题我无法找到解决方案。
我将每个传入的请求路由到index.php文件,该文件位于我的框架的基本路径中。当然,在包括css时使用相对路径是没有问题的,例如:
<link rel="stylesheet" type="text/css" href="style/include/css/style.css" />
这在浏览器中非常有效。当然,我在URL中输入的内容并不重要,因为每个请求都会如上所述重定向到索引,以便合理路由。
但是,当我的网址包含多个看似子文件夹的斜线时,例如:&#34; / manual / details / 1_2&#34;然后我得到一个正常的路由过程,但浏览器找不到css文件,除非我添加&#34; ../"为每个&#34; /&#34;在我的网址中向后映射到我的基本路径。
例如,对于上述网址,这将起作用:
<link rel="stylesheet" type="text/css" href="../../style/include/css/style.css" />
我的解决方案:
我在路由类中编写了一个PHP函数,用于确定所需的&#34; ../"我总是在实现资源之前强制转换函数来构建精确的 任何时候的路径。
示例:
<link rel="stylesheet" type="text/css" href="<?=Router::getInstance()->getSubdirectoryPrefix()?>style/include/css/style.css" />
毋庸置疑,这是非常不方便的,如果您忘记放置该功能,也会很糟糕。如果你的路线发生了变化,或者你忘记了你在一个子目录中,你会想知道为什么你的资源无法找到。
我也知道在我的Apache的虚拟主机配置中添加Alias / public style /这样的别名,但是我想找到另一个 - 项目和PHP内部方式,而不会有一个不方便的废话,如粘贴别名函数所有时间而不设置虚拟主机选项,因此框架可以保持轻量级,并且不需要任何令人讨厌的外部选项,如修改虚拟主机。
我很乐意听到您的解决方案,最好是.htacces - 哦,通过谈论它,我将.htaccess代码留在这里:
RewriteEngine On
Options -Indexes
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]
先谢谢你的帮助〜
答案 0 :(得分:1)
您的html链接(css,javascript,图片等)必须使用绝对路径而不是相对路径。
例如:
<link rel="stylesheet" type="text/css" href="/style/include/css/style.css" />
前导斜杠(在style
之前)意味着从文档根文件夹开始,然后进入style
文件夹,依此类推......(如果它是&#39;那么你可能有另一个前缀目录。不在根文件夹中)
您遇到了一些问题,因为您的某些规则可以创建虚拟目录(例如:http://domain.com/some/directory/subdirectory/etc/
)。
另外,在你的htaccess中,使用前导斜杠(或RewriteBase
)
Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.php [L]
或(两者都相同)
Options -Indexes
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]