我有一个非常标准的.htaccess文件:
RewriteEngine on
RewriteCond $1 !^(index'.php|resources|robots'.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?$1 [L]
当我有一个参数时,它工作得很好。 例如这/mysite/index.php?c=home
就像这样工作/mysite/home
这个/mysite/index.php?c=home&m=mymethod
像这样工作/mysite/home/mymethod
...除了加载相关资源。
网址/mysite/home/mymethod
似乎使Web浏览器具有相对路径/mysite/home
而不是/mysite/
。当我转到/mysite/home/mymethod
并尝试加载具有相对路径的 css、图像或 js 文件(例如 html 表示 css/site.css
)时,浏览器会将home/
附加到路径的开头。这意味着,网络浏览器尝试加载home/css/site.css
而不是css/site.css
...简而言之,当我指定第二个参数时,相对路径就会被灌输。
为什么在指定第二个 uri 参数时相对路径错误?
当浏览器请求内容,并且该内容具有相对链接(指向css,图像,js等)时,由浏览器确定相对URI基数。浏览器通过查看它请求的 URL 来执行此操作。例如,如果我在浏览器的地址栏中键入以下内容:
http://mysite.com/home/mymethod/maybe-a-file.html
从文件maybe-a-file.html
提供的内容(在此示例中为静态)包含指向图像的链接:
<img src="boo.jpg">
因此,由浏览器确定相对 URI 基数是什么,以便实际请求该图像。这个例子很简单。它查看请求的 URL,并删除最后一个文件节点,并得到:
http://mysite.com/home/mymethod/
因此,它将图像加载到:
http://mysite.com/home/mymethod/boo.jpg
足够简单。但是,在您的情况下,浏览器正在加载此 URL:
http://mysite.com/home/mymethod
这不是静态页面,但浏览器不知道。它所知道的只是URL和它返回的内容,它得到
的内容是:<img src="boo.jpg">
因此,它会查看 URL 并找到一个基础:
http://mysite.com/home/
因此尝试在以下位置加载图像:
http://mysite.com/home/boo.jpg
浏览器对实际从/index.php
提供的内容一无所知。这一切都发生在服务器内部,它只知道它请求的URL,没有别的。
因此,为了解决此问题,您必须将相对路径更改为绝对路径,以便浏览器不会错误地猜测错误的基本 URI,或者您可以指定基本 URI,这样浏览器就不必猜测。您可以通过将其添加到页面标题来执行此操作:
<base href="/" />
或任何基地应该是什么。
http://ellislab.com/codeigniter/user-guide/helpers/url_helper.html
您可以使用网址帮助程序$this->load->helper('url')
并使用base_url()
函数来获取要用于链接或包含 css/js 文件的网站的基本路径。