将profile / foo等URL重写为profile.php?username = foo时,样式表会中断

时间:2012-12-25 11:19:50

标签: url-rewriting

我在.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.phpincludes/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

2 个答案:

答案 0 :(得分:4)

问题是那些都是内部重写。因此,即使您的网络服务器正在从/profile.php?username=whatever发送数据,浏览器仍然认为它正在接收来自http://www.mydomain.com/profile/whatever的网页。

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

我至少可以想到三种不同的方法来解决问题:

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

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

  3. 还可以使用更多重写规则解决问题,例如:

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

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

答案 1 :(得分:2)

您还可以使用基本网址在config.php文件中创建变量:

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

然后在你的头文件中:

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