因为htaccess规则包括带有css和javascript中断的标头

时间:2013-06-28 23:24:59

标签: php

我的php项目中有以下结构:

- classes
    - model.php
- views
    - header.php
    - footer.php
    - user.php
- resources
    - css
        - stylesheet.css
    - js
        - my_javascript.js
- index.php
- controller.php

.htaccess文件

RewriteEngine On
RewriteRule ^/?resources/(.*)$ resources/$1 [L]
RewriteRule ^([a-zA-Z]+)/?([a-zA-Z0-9/]*)$ index.php?page=$1&query=$2 [L]

的header.php

<!DOCTYPE html>
<html>
    <head>
       <!-- Styles -->
       <link href="resources/css/stylesheet.css" rel="stylesheet" media="screen">
    </head>
    <body>

正如许多其他人之前在stackoverflow上提到的那样(但其解决方案对我没有用),问题是我目前通过index.php重定向所有页面,因此甚至是我的资源文件,例如stylesheet.css。

1:当我要求mydomain/user时,我会使用正确的css(mydomain/resources/css/stylesheet.css

加载正确的资源

2:但是当我试图让应用程序RESTful时,我有一个页面,例如mydomain/user/4,当我提出这样的请求时,我的css突然没有加载。查看它查找的http请求(mydomain/user/resources/css/stylesheet.css

我试图通过加入$_SERVER['DOCUMENT_ROOT']来解决这个问题。它不起作用,似乎不是一个“好”的解决方案。谢谢你的帮助。是的,我是php的新手!

2 个答案:

答案 0 :(得分:1)

由于您正在屏蔽URL并且实际脚本在与URL中找到的文件夹结构不同的文件夹结构上运行,因此您必须提供在程序中引用的CSS,图像,Javascripts等的完整路径。

您可以将代码更改为以下

<link href="http://www.yourdomainname.com/resources/css/stylesheet.css" rel="stylesheet" media="screen">

或使用文件的相对路径

<link href="/resources/css/stylesheet.css" rel="stylesheet" media="screen">

由于我们在文件路径的起始处使用/,因此服务器将从网站的根工作目录中查找该文件。

除此之外,您还应在htaccess文件中添加条件,如下所示

RewriteCond %{REQUEST_FILENAME} !(resources|img|anyother folders that you want to ignore|anyother folders that you want to ignore|...)
RewriteRule ^([a-zA-Z]+)/?([a-zA-Z0-9/]*)$ index.php?page=$1&query=$2 [L]

我希望在做出这些修改后你不需要htaccess中的RewriteRule ^/?resources/(.*)$ resources/$1 [L]

答案 1 :(得分:0)

由于htaccess中的更改不起作用,因此我将标题加载为绝对路径,而不是像

$http_host = $_SERVER['HTTP_HOST'];
$file_path = $_SERVER['PHP_SELF'];
$info = pathinfo($file_path);
$root_path = "http://" . $http_host . $info['dirname']; 
$path = $root_path . "/resources/css/stylesheet.css";

我希望这可以帮助其他人解决同样的问题...