带有.htaccess的相对URL

时间:2011-09-30 21:18:00

标签: php .htaccess

我有一个自定义的PHP框架,其中域之后的所有内容都作为$ _GET变量发送给PHP,如下所示:

RewriteRule ^(.*)$ index.php?page_request=$1 [QSA,L]

所有路由都由路由器文件完成。例如,http://domain.tld/page会被发送到http://domain.tld?page_request=home

但是,如果我有类似目录的结构(即http://domain.tld/page/),则会发送请求,但HTML 中的任何相对URL现在都相对于/page ,即使我们仍处于域中的根级别。

澄清:

转到http://domain.tld/page并在HTML中请求res/css/style.css会返回样式表。

转到http://domain.tld/page/并请求res/css/style.css会返回404错误,因为page/目录实际上并不存在。

解决这个问题的最佳方法是什么?这看起来非常简单,但是我对.htaccess还不够好,还没有做到这一点。谢谢你提前得到任何答案。

编辑:此外,我的.htaccess文件包含:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

编辑#2:是的,我知道使用领先的/.

但是,我无法使用此特定网站,因为它是服务器上的子文件夹,因此链接到/将转到服务器的根目录而不是网站。

如果我为网站上的每个链接添加/subfolder/css,那不仅会变得单调乏味,而且还会出现更改子文件夹的问题。有没有更好的方法来解决这个问题?

4 个答案:

答案 0 :(得分:3)

相对URL不受apache重写规则的影响。他们取决于浏览器。如果浏览器发送/some/random/path/请求,您可以在服务器端重写所有内容,但浏览器会将所有相对URL解释为在/some/random/path/

如果您想从根目录中添加res/css/style.css,则应在其前面添加一个前导斜杠,以明确说明:/res/css/style.css

答案 1 :(得分:2)

其他答案表明你必须对路径进行绝对化是正确的。如果您在子文件夹中工作,您可以/应该做两件事来帮助:

1)在htaccess文件中使用RewriteBase

RewriteEngine on
RewriteBase /framework/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)/?$    index.php?url=$1    [QSA,L]

2)在框架中创建一个具有相同路径的常量

define('FULL_PATH', '/framework');

然后每次在html中创建一个URL时,请确保执行类似

的操作
<a href="<?= FULL_PATH ?>/your/remaining/path">

每次在页面上创建URL时都需要考虑一些额外的工作,但从长远来看,它将为您提供良好的服务。

答案 2 :(得分:2)

如果您正在寻找动态解决方案(如果您将整个站点移动到子文件夹或不同的域),您可以使用PHP来获取正在运行的文件的绝对路径(如您的主要php文件)和然后将该路径存储在可用于所有链接的常量或变量中。

if ( !isset($_SERVER['HTTPS']) ) { $domain = 'http://'.$_SERVER['HTTP_HOST']; }
else {  $domain = 'https://'.$_SERVER['HTTP_HOST']; };
$root = $domain.str_replace($_SERVER['DOCUMENT_ROOT'], '', dirname(__FILE__) );

前两行只是设置路径的起始方式,无论是http还是https。 第三行获取此代码所在文件的完整服务器路径,删除不必要的部分(user / public_html)并将其存储在变量$ root中。

然后,您可以通过以下方式链接文件:

  

&lt; script src =“&lt;?php echo $ root;?&gt; /jquery.js”&gt;&lt; / script&gt;

使用此方法,网站可以移动到任何域或子文件夹,您不必担心断开链接。

编辑: 我只是想到了一种更简单的方法来使用这种方法。您可以在文档的开头使用正常的相对链接,而不是使用绝对链接:

<base href="<?php echo $root; ?>/">

这将重写指向正确目录的相对链接的基本路径。然后这将工作:

<script src="jquery.js"></script>

答案 3 :(得分:1)

您需要对html代码中的所有路径进行绝对化,以便使用绝对路径而不是相对路径链接到CSS。

如果您遇到此问题,我怀疑您的CSS看起来像这样:

<link href="res/css/style.css" rel="stylesheet" type="text/css" media="screen" />

但它应该看起来像:

<link href="/res/css/style.css" rel="stylesheet" type="text/css" media="screen" />

对javascript,css,图像文件和链接执行相同的操作,您应该可以使用重写规则。