mod_rewrite VS相对路径

时间:2011-06-13 17:20:21

标签: php apache mod-rewrite

我的mod_rewrite代码是:

Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

此结构位于我的服务器路径/beta

当我放置网址http://mydomain.com/beta/download时,所有内容都会重写为真实路径http://mydomain.com/beta/index.php?url=download

问题发生在相对路径上。当我输入网址http://mydomain.com/beta/download/box时,重写将转到http://mydomain.com/beta/index.php?url=download/box ...但是......

我所有的相对路径,比如我的css文件夹,我的js文件夹,图像文件....我的index.php页面中相对路径的所有内容都崩溃,因为我的相对路径变为download/css,{{1} },download/js ......等......

我知道这个问题是由于路径“download /”中的斜杠而发生的,但是如何使用.htaccess中的mod_rewrite解决这个问题?

我可以阻止相对路径中的重写吗?甚至在我自己领域的内部路径中?

如何在不改变绝对路径的相对路径的情况下解决这个问题?

由于

5 个答案:

答案 0 :(得分:12)

在HTML头部添加<base href="yoururl.com/beta/"; />标记。如果您在该子文件夹中,还要将RewriteBase / beta /添加到htaccess

答案 1 :(得分:1)

在使用mod_rewrite时,你应该总是使用图像css等的绝对路径,但简单的解决方案可能是忽略css,js,图像并在RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]

中休息
RewriteRule ((js|css|images)\/.*)$ /$1 [L,NC]

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

但是,如果这些目录实际上取决于当前网址

,则可能无效

答案 2 :(得分:1)

我测试了标签,没有必要注明http://以下代码对我有用:

<base href="<?php echo dirname($_SERVER['PHP_SELF']);?>/" />

答案 3 :(得分:0)

服务器永远不会知道请求是通过相对路径还是绝对路径传递的,因此您无能为力。正如另一个答案中所说,你可以做出例外但是保持所有这些例外将在某些时候成为PITA。 ;)

我总是使用绝对路径,特别是在重写时所以我建议这样,这是最简单的方法

答案 4 :(得分:0)

添加行:

<BASE href="http://www.sitename.com/">

到我<head>标记内的页面对我来说很有用。它甚至可以编码为PHP函数自动化,因此您不必在其他场合复制/粘贴。

<强>更新

<?php
$BaseDir = 'http://'.$_SERVER['SERVER_NAME'].substr($_SERVER["SCRIPT_NAME"], 0, strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
?>

<head>
...
<BASE href="<?php echo $BaseDir; ?>">
...
</head>