1

我在一个.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

4

2 回答 2

4

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

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

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

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

  2. 或者,您可以base在 HTMLhead部分中包含一个标签,如 slash197 建议的那样,例如<base href="http://www.mydomain.com/">. 这样,您 HTML 中的所有相对 URL 都将被解释为相对于您网站的根目录。

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

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

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

于 2012-12-25T14:44:28.147 回答
2

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

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

然后在你的头文件中:

<link href="<?php echo $base_url; ?>css/style.css" />
于 2013-10-29T22:32:16.443 回答