我的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的新手!
答案 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";
我希望这可以帮助其他人解决同样的问题...