我有一个自定义的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还不够好,还没有做到这一点。谢谢你提前得到任何答案。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
但是,我无法使用此特定网站,因为它是服务器上的子文件夹,因此链接到/
将转到服务器的根目录而不是网站。
如果我为网站上的每个链接添加/subfolder/css
,那不仅会变得单调乏味,而且还会出现更改子文件夹的问题。有没有更好的方法来解决这个问题?
答案 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,图像文件和链接执行相同的操作,您应该可以使用重写规则。