我的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解决这个问题?
我可以阻止相对路径中的重写吗?甚至在我自己领域的内部路径中?
如何在不改变绝对路径的相对路径的情况下解决这个问题?
由于
答案 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>