0

我在根文件夹中的 .htaccess 文件中有以下规则

RewriteEngine on

RewriteRule ^/?$ /testsite/index.php?rel=m
RewriteRule ^about/?$ /testsite/aboutus.php?rel=b
RewriteRule ^ict/?$ /testsite/ict.php?rel=b
RewriteRule ^eeap/?$ /testsite/eeap.php?rel=b

索引规则在有或没有斜杠的情况下都可以正常工作。但是,当我点击http://mydomain.com/testsite/about/时,该页面在没有 CSS 和图像的情况下提供,并且如果最后一个斜杠被删除,则可以正常工作。这也发生在ICT规则中。

对于下一条规则(eeap),事情的表现是相反的。如果我用斜杠结束 URL,CSS 和图像就会丢失。

我在这里做错了什么?

4

1 回答 1

2

您需要从 Web 浏览器的角度考虑这一点。

如果 URL 不以斜杠结尾,例如“/about”,则 Web 浏览器假定它正在查看 Web 服务器顶级目录中名为“about”的文件。因此,由“/about”生成的页面中具有相对路径的任何请求都将导致 Web 浏览器基于从顶级目录开始生成完整路径。例如,“css/style.css”的 CSS 文件路径将导致浏览器从顶层开始并从“/css/style.css”请求文件。

但是,如果 URL 确实以斜杠结尾,在我们的示例中为“/about/”,则 Web 浏览器认为它正在查看一个名为“about”的子目录。现在,相同的 CSS 文件路径“css/style.css”将导致 Web 浏览器从“/about/css/style.css”请求文件。

一个 CSS 文件路径是正确的,另一个则不是。因此,您看到的行为。

有几种方法可以避免这种情况。您可以告诉 Apache 将所有请求永久重定向到以斜杠结尾的 URL 或不以斜杠结尾的 URL,这样所有访问者最终都会看到相同的 URL。这使得知道在您的网页中使用哪些相对 CSS 和图像路径成为可能。

或者您可以修改您的网页,以便 CSS、图像、JavaScript 等的所有文件路径都锚定到顶级目录。例如,“css/style.css”将变为“/css/style.css”(注意路径开头的正斜杠告诉浏览器从顶级目录开始)。

或者您可以添加一堆复杂的 mod_rewrite 规则来尝试捕获 CSS 文件等的所有可能结果。我不赞成这种方法,因为它通常会使您的规则集更加脆弱和复杂。

于 2013-07-02T13:00:44.610 回答