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