样式表在将URL(如profile/foo)重写为profile.php?username=foo时会中断



我在.htaccess文件中有以下代码:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [NC,L]
RewriteRule ^profile/(.*)$ profile.php?username=$1

我的CSS样式表在所有页面上工作,除了匹配最后一条规则(用于配置文件)的页面:

RewriteRule ^profile/(.*)$ profile.php?username=$1

例如,当我输入www.mydomain.com/register时,样式表正在工作。但是当我输入www.mydomain.com/profile/username时,样式表不起作用。

我的样式表和其他辅助文件在不同的文件夹:css/, images/, js/

我能做什么?请帮忙:D


编辑:我有一个页眉和页脚:includes/header.php, includes/footer.php。在文件header.php中是PHP代码:
<?php include 'head.php'; ?>

head.php是CSS的元标签:

<link rel="stylesheet" href="css/screen-site.css">
下面是文件夹结构的截图:http://shrani.si/f/3z/13T/1OKC8ZJc/site.png

问题是这些都是内部的重写。所以,即使你的服务器从/profile.php?username=whatever发送数据,浏览器仍然认为它从http://www.mydomain.com/profile/whatever接收页面。

因此,当它看到像css/screen-site.css这样的相对URL时,它将其解析为不存在的http://www.mydomain.com/profile/css/screen-site.css

我能想到至少三种不同的方法来解决这个问题:

  1. 最简单也是最好的解决方案是在链接前添加/,使它们看起来像/css/screen-site.css。斜杠使浏览器将URL路径视为相对于站点根目录的路径,而不是(它认为是)当前目录。

  2. 或者,您可以在HTML head部分中包含base标记,如slash197所建议的,类似于<base href="http://www.mydomain.com/">。这样,HTML中的所有相对url都将被解释为相对于您站点的根目录。

  3. 可以也可以用更多的重写规则来解决这个问题,比如:

    RewriteRule ^profile/((css|images|js)/.*) $1 [L]
    

    这比前两种解决方案效率低,但是,因为浏览器不会意识到不同的url实际上引用了相同的样式表(即使您使用外部重写来告诉它它们确实引用了相同的样式表,它仍然需要查询服务器来查找)。

你也可以在config.php文件中用你的基url创建一个变量:

$base_url = "http://www.yourdomain.com/";

然后在你的头文件中:

<link href="<?php echo $base_url; ?>css/style.css" />

最新更新