1

我有一个非常标准的 .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......除了加载相关资源。

该 url/mysite/home/mymethod似乎使 Web 浏览器具有相对路径,/mysite/home而不是/mysite/. 当/mysite/home/mymethod我尝试使用相对路径(例如 html 表示css/site.css)加载 css、图像或 js 文件时,浏览器会附加home/到路径的开头。意思是,网络浏览器尝试加载home/css/site.css而不是css/site.css......简而言之,当我指定第二个参数时,相对路径会被破坏。

为什么我指定第二个 uri 参数时相对路径错误?

4

2 回答 2

1

当浏览器请求内容并且该内容具有相对链接(到 css、图像、js 等)时,由浏览器决定相对 URI base。浏览器通过查看它请求的 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="/" />

或任何基础应该是什么。

于 2013-10-24T03:36:59.870 回答
0

http://ellislab.com/codeigniter/user-guide/helpers/url_helper.html

您可以使用 url helper$this->load->helper('url')和 usebase_url()函数来获取站点的基本路径以用于链接或包含 css/js 文件。

于 2013-10-24T05:22:36.777 回答