2011-03-28 71 views
2

我使用以下URL重写设置:URL重写打破链接到CSS

RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

index.php是解析$_GET['url']因此,在下面的例子:

ROOT/user/id/1/name/bobby // user is the page, id = 1, name = bobby 
ROOT/blog/post/123/title/welcome // blog is the page, post = 123, title = welcome 

,使得第一参数(?我不知道如何调用它)是页面名称,那么以下几个参数就像“键/值”。 现在,当我浏览ROOT/链接到插入到页面的HTML和页面内的样式表显示正确。 我浏览ROOT/index(与ROOT/相同)它正确地显示页面(包含内容和其他内容),但链接(即使在html结构中正确写入)到样式表不加载。我可以看到,从我的网页没有CSS时,我加载它的事实。

我该如何解决这个问题?

编辑

CSS文件的路径如下:

project/view/css/common.css 

是它包含该文件是在

project/public/index.php // the one with .htaccess and rewrite rules 

这使我做一个链接(内index.php)如

../view/css/common.css 

但是,这工作根据网址看起来不同。对于例子:

# For URL = public/ 
project/view/css/common.css // good 
# For URL = public/index/ 
project/public/view/css/common.css // broken 
# For URL = public/index/key/value 
project/public/index/key/view/css/common.css // broken 
+1

你的CSS链接在你的html样子是什么样的?他们是否有前面的斜线? – davogotland 2011-03-28 17:49:55

+0

@davogotland,我的链接看起来像真正的路径链接。 – Shoe 2011-03-28 20:06:03

+0

@davogotland,他们看起来像这样http://localhost/project/public/view/css/index.css – Shoe 2011-03-28 20:22:59

回答

3

我认为你有两个问题(如给定的答案didn't解决您的问题尚未...):

  1. 你重写所有文件名的文件在该网页上引用所以当浏览器请求css/index.css时,您的重写将转换为index.php?url=css/index.css。 @ cOle2的答案应该可以解决这个问题。

  2. 你没有为你的css文件使用绝对路径。服务器正在将请求的页面(如/user/id/1/name/bobby)翻译为/index.php?etc....,但当浏览器请求例如代码中类似css/index.css的css文件时,它实际上会请求/user/id/1/name/bobby/css/index.css,并且该文件不存在。您可以通过仅使用绝对路径来连接外部文件(css,js,图像等),如/css/index.css

编辑:根据您的意见,无论是你的路径是相对的,你的CSS是不是由浏览器访问的,所以你需要:

  1. 移动的CSS到project/public目录(像project/public/css
  2. 使用绝对路径到您的css像/css/index.css
  3. 确保您的外部文件的URL不被服务器重写。
+0

我认为这是一个好方法。问题在于我使用相对路径(如“../view/css/common.css”)来访问公用文件夹中的文件。我怎么能把它变成绝对路径? – Shoe 2011-03-28 20:38:07

+0

@Charlie Pigarelli与您的目录结构相比,Web服务器的根源是什么?如果它是'project/public /',那么你的css文件不能公开访问,所以你需要将它们移动到'project/public /'目录。 – jeroen 2011-03-28 20:42:20

+0

用户浏览的目录是'project/public /',这样他就不能访问其他文件夹,比如'project/class /'或'project/library /'或'project/view'。而css文件在'project/view/css/common.css'上。 – Shoe 2011-03-28 20:44:54

2

你可以尝试从重写规则删除某些文件扩展名,例如下面的规则将忽略图像,CSS和JS文件。

# Do not process images or CSS files further 
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L] 

编辑:这是我会怎么应用它:

RewriteEngine On 
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
+0

@ cOle2,我如何在我现有的代码中实现它? – Shoe 2011-03-28 20:01:15

+0

把它放在RewriteEngine在线 – cOle2 2011-03-28 20:32:42

+0

@ cOle2,不起作用。另外我更新了我的问题。请看一下。 – Shoe 2011-03-28 20:36:17

7

评论不会让我格式化代码,可以请你试试这个:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*\.(css|jpe?g|gif|png|js|ico)$ [NC] 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

更新

您可以在页面的<head>部分尝试类似的操作,以支持image/css/js的相对路径

<head> 
<base href="http://www.example.com/static-files/" /> 
</head> 
+0

它不起作用。 – Shoe 2011-03-28 20:19:03

+0

@Charlie Pigarelli:请尝试添加基本标记以支持页面上的静态文件的相对URL:例如' ' – anubhava 2011-03-28 20:44:36

+0

+1这是我正在寻找的线,以阻止我的要求被重写的外部东西! – 2011-06-02 17:11:13