我正在编写一个自定义PHP框架,用于我的项目,并且我在加载CSS,JS和图像文件时遇到了一些问题。
以下代码位于我的.htaccess文件中 -
RewriteEngine On
#rewrite to base folder
RewriteBase /SimplexFramework/
#add trailing slashes
RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
如果路径没有指向文件,这基本上表明将请求重定向到index.php。
以下是我的目录结构。 CSS,JS文件夹存在于files
下。
我的观看文件位于app/view
,我通过路径加载CSS和JS文件 - files/css/style.css
或files/js/script.js
当我在浏览器中的网址为http://localhost:8081/SimplexFramework/
时,事情会按预期进行。
例如,当URL更改为http://localhost:8081/SimplexFramework/Users/login
时,apache将无法再按预期找到文件。
在浏览器中,我看到以下请求 -
http://localhost:8081/SimplexFramework/User/register/files/js/scrits.js
我可以请求apache从我有.htaccess的文件夹中查找文件。与RewriteBase
类似的东西?
答案 0 :(得分:2)
如果您的内容中包含相对网址,则由浏览器决定如何加载它们。这与htaccess或重写规则有 nothing 。
假设浏览器加载此网址:http://localhost:8081/SimplexFramework/Users/login
在该页面的内容上,它会看到一个链接:<script src="files/js/scripts.js">
由于链接是相对的(不是以“http”或“/”开头),浏览器现在必须猜测相对URL基数是什么,并且它唯一需要处理的是URL。所以URL中的最后一个路径是“login”,它会删除它并使用basename作为URL基础,所以它得到:
http://localhost:8081/SimplexFramework/Users/files/js/scripts.js
这是100%的相对/绝对网址问题,与您的规则无关,与RewriteBase
无关。这是因为您的链接是相对的,并且网址已从http://localhost:8081/SimplexFramework/
更改为http://localhost:8081/SimplexFramework/some/stuff/that/eventually/gets/rewritten/
。
要解决此问题,请将您的网址设为绝对网址:<script src="/SimplexFramework/files/js/scripts.js">
或将正确的网址添加到网页标题中:
<base href="/SimplexFramework/" />