我在我们的根目录下的.htaccess文件中使用了mod_rewrite,这样我们可以在一些特定的情况下使用更清晰的URL。 例如,我们要翻译:
http://example.com/Topic/ABCD/Type/Description
成
http://example.com/Topic.php?l=ABCD&e=Type&t=Description
这似乎很容易, .htaccess文件包含:
RewriteEngine on RewriteRule ^Topic/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /Topic.php?l=$1&e=$2&t=$3 [L]
但是,所有页面的内容(.CSS文件,图像等)最终都是404',因为不是从相对于重写URL的目录加载“/Common.css”:
http://example.com/Common.css
它从未重写的URL的目录中加载它:
http://example.com/Topic/ABCD/Type/Description/Common.css
这显然不存在。 然而,我在网上发现了无数的教程,提倡我正在做的一些变体( 这里是一个例子),但是没有提到我遇到的这个问题,所以我想知道是否只有一些configuration我俯视。 他们不能都依靠这些“虚拟”目录,并且包含页面的内容。 我也不想把一切都变成绝对path。
我曾尝试在.htaccess文件的早期添加规则来尝试短路内容请求,例如:
RewriteRule \.(css|jpe?g|gif|png)$ - [L]
但似乎没有效果。 无论如何,我不会想到这样的内容甚至会匹配原来的规则,因为该规则中的正则expression式不允许跟随(可选的)尾随斜杠之后的任何内容。
如果我改变规则,使其标志被设置为redirect([R,L]而不是只是[L]),那么它一切正常 – 除了现在浏览器显示重写的PHP参数string,这就是我们试图避免。 过去,我们刚刚接受这个作为解决方法,但是现在我正试图理解为什么这样工作,以及我能做些什么。
如果是相关的,我使用CentOS 6.2和Apache / 2.2.15。
问题很可能是您的代码生成包含CSS的页面,如下所示:
<link rel="stylesheet" type="text/css" href="Common.css" />
由于浏览器可以看到它,并将其作为子path获取,因此它会在该子path上请求Common.css。
你可以(但不应该,因为我会解释的一些原因)做一些更改重写规则,重写Common.css等到顶层的单个,例如:
重写引擎
RewriteRule ^ Topic /([^/.]+)/([^/.]+)/([^/.]+)/ Common.css $ /Common.css [L]
然而,这将是愚蠢的,因为整个CSS的重点是允许caching等。一个更好的方法是简单地在你的代码中添加一个/在Common.css的前面,所以它产生的CSS如下所示:
<link rel="stylesheet" type="text/css" href="/Common.css" />
这样,所有页面都使用相同的Common.css文件,浏览器不必在每个页面的多个逻辑位置获取同一文件的副本,而且浏览器还知道要在顶层获取它,而不是在一个子页面上。
PS Jakub:RewriteRule的正则expression式已经排除了任何已经覆盖了.css,.jpg等的句点,所以添加额外的RewriteCond将无济于事。
你必须使用RewriteCond
RewriteEngine on RewriteCond $1 !^(\.css|\.js|\.png|\.jpg) RewriteRule ^Topic/([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ /Topic.php?l=$1&e=$2&t=$3 [L]
答案相对简单 – 您必须在您的html代码中使用base href,因为重写URI的过程将重置导致您遇到的404的基本URL。
这里有一篇很好的文章http://pixelcode.co.uk/tutorials/Clean+URLs+with+mod_rewrite.html
关心里程