Php Url重写中断了到css的链接

Php Url重写中断了到css的链接,php,html,css,.htaccess,url-rewriting,Php,Html,Css,.htaccess,Url Rewriting,我正在使用以下url重写设置: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 在index.php中,是parse$\u GET['url'],因此在以下示例中: ROOT/user/id/1/name/bobby // user is the page

我正在使用以下url重写设置:

RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
index.php
中,是parse
$\u 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
# 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
因此,第一个参数(?我不知道如何调用它)是页面名称,接下来的两个参数类似于“keys/value”。 现在,当我浏览
ROOT/
时,插入到页面html中的样式表链接和页面被正确显示。 I fi browse
ROOT/index
(与
ROOT/
相同)它正确显示页面(包含内容和其他内容),但未加载指向样式表的链接(即使在html结构中正确写入)。我可以从我的页面在加载时根本没有css这一事实看出这一点

我怎样才能解决这个问题

编辑

css文件的路径如下所示:

project/view/css/common.css
包含它的文件位于中

project/public/index.php // the one with .htaccess and rewrite rules
这使我创建了一个链接(在index.php内),如

但这取决于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
# 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

您可以尝试从重写规则中删除某些文件扩展名,例如,以下规则将忽略图像、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]

注释不允许我格式化代码,请尝试以下操作:

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]
更新 您可以在页面的
部分尝试类似的操作,以支持该页面上引用的图像/css/js文件的相对路径:

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

我认为您有两个问题(因为给出的答案还没有解决您的问题……):

  • 您正在重写所有文件名,因此当浏览器请求
    css/index.css
    时,您的重写会将其转换为
    index.php?url=css/index.css
    @科尔2的回答应该能解决这个问题

  • 您没有为css文件使用绝对路径。服务器正在将请求的页面(如
    /user/id/1/name/bobby
    转换为
    /index.php?等…
    但是当浏览器请求css文件(例如,代码中类似
    css/index.css
    的css文件)时,它实际上会请求
    /user/id/1/name/bobby/css/index.css
    ,而该文件不存在。您可以通过只使用外部文件(css、js、图像等)的绝对路径来解决这个问题,如
    /css/index.css

  • 编辑:根据您的评论,您的两条路径都是相对的,浏览器无法访问您的css,因此您需要:

  • 将css移动到
    project/public
    目录(如
    project/public/css
  • 使用css的绝对路径,如
    /css/index.css
  • 确保服务器未重写指向外部文件的URL

  • html中的css链接是什么样子的?它们是否有前面的斜杠?@davogotland,我的链接看起来像真正的路径链接。@davogotland,它们看起来像这样,请在重写引擎打开后将其放入line@cOle2,不工作。我也更新了我的问题。请看一看。看一看@jeroen的答案,因为听起来你的路径是相对的。简单的解决方案是在css文件路径的开头加一个斜杠:/project/view/css/common.css@anubhava update也应该可以。我认为这是一个好方法。问题是我正在使用相对路径,如“./view/css/common.css”来访问返回到公用文件夹的文件夹中的文件。我怎样才能将其转换为绝对路径?@Charlie Pigarelli与目录结构相比,您的web服务器的根是什么?如果它是
    project/public/
    ,则您的css文件不可公开访问,因此您需要将它们移动到
    project/public/
    目录。用户浏览的目录是
    project/public/
    ,因此他无法访问所有其他文件夹,例如
    project/class/
    project/library/
    项目/视图
    。当css文件位于
    project/view/css/common.css
    @Charlie Pigarelli时,这就是问题所在,用户无权访问
    项目/视图
    目录中的css文件。@Charlie Pigarelli:请尝试添加基本标记以支持页面上静态文件的相对URL:eg
    +1这是我正在寻找的一行,用于阻止我对重写外部内容的请求!