Url rewriting 将类似profile/foo的URL重写为profile.php?username=foo时,样式表会中断

Url rewriting 将类似profile/foo的URL重写为profile.php?username=foo时,样式表会中断,url-rewriting,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样式表适用于所有页面,但与上一条规则(用于配置

我将此代码保存在
.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样式表适用于所有页面,但与上一条规则(用于配置文件)匹配的页面除外:

例如,当我键入
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'; ?>

下面是文件夹结构的屏幕截图:

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

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

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

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

  • 或者,您可以像slash197所建议的那样,在HTML
    标题中包含一个
    base
    标记,类似于
    。这样,HTML中的所有相对URL都将被解释为相对于站点的根

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

    RewriteRule ^profile/((css|images|js)/.*) $1 [L]
    
    但是,这比前两种解决方案的效率要低,因为浏览器不会意识到不同的URL实际上引用了相同的样式表(即使您使用外部重写来告诉它确实如此,它仍然需要查询服务器才能找到)


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

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

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

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

  • 或者,您可以像slash197所建议的那样,在HTML
    标题中包含一个
    base
    标记,类似于
    。这样,HTML中的所有相对URL都将被解释为相对于站点的根

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

    RewriteRule ^profile/((css|images|js)/.*) $1 [L]
    
    但是,这比前两种解决方案的效率要低,因为浏览器不会意识到不同的URL实际上引用了相同的样式表(即使您使用外部重写来告诉它确实如此,它仍然需要查询服务器才能找到)


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

    $base_url = "http://www.yourdomain.com/";
    
    然后在头文件中:

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

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

    $base_url = "http://www.yourdomain.com/";
    
    然后在头文件中:

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

    我不明白为什么会这样。您没有处理该条件的逻辑。@WaleedKhan好吧,它看起来会被重写为
    /user/username.php
    ,但问题是第二条规则捕获了所有内容,结果是
    /profile.php?username=/user/username.php
    如果您对图像/css/javascript使用相对URL,您可以在html中设置
    base
    元标记,那么它将不会与.htaccess文件冲突。实际上,我有一个页眉和一个页脚,如下所示:includes/header.php,includes/footer.php。在header.php文件中是一个php代码:在这个head.php文件中是css的元标记:您的建议,我现在应该做什么?文件夹结构屏幕:抱歉:这是我的实际代码:
    Options+FollowSymLinks
    RewriteEngine On
    RewriteCond%{SCRIPT\u FILENAME}-d
    重写cond%{SCRIPT\u FILENAME}-f
    RewriteRule^([^\.]+)$$1.php[NC,L]
    RewriteRule^profile/(.*)$profile.php?username=$1
    我不明白为什么会这样。您没有处理该条件的逻辑。@WaleedKhan好吧,它看起来会被重写为
    /user/username.php
    ,但问题是第二条规则捕获了所有内容,结果是
    /profile.php?username=/user/username.php
    如果您对图像/css/javascript使用相对URL,您可以在html中设置
    base
    元标记,那么它将不会与.htaccess文件冲突。实际上,我有一个页眉和一个页脚,如下所示:includes/header.php,includes/footer.php。在header.php文件中是一个php代码:在这个head.php文件中是css的元标记:您的建议,我现在应该做什么?文件夹结构屏幕:抱歉:这是我的实际代码:
    Options+FollowSymLinks
    RewriteEngine On
    RewriteCond%{SCRIPT\u FILENAME}-d
    重写cond%{SCRIPT\u FILENAME}-f
    RewriteRule^([^\.]+)$$1.php[NC,L]
    RewriteRule^profile/(*)$pro