一种避免Apache Alias路径以包含CSS等HTML资源的方法

时间:2014-09-02 18:55:19

标签: php html apache mod-rewrite

这是一个问题,因为我目前的解决方案并不能让我满意以下问题:

我有一个自己的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]

先谢谢你的帮助〜

1 个答案:

答案 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]