如何在不改变相对path的情况下使用Apache的mod_rewrite rewriterule

我在.htaccess中有以下重写规则:

RewriteRule ^groups/([^/\.]+)/?$ groupdetail.php?gname=$1 [L,NC] 

这需要诸如www.example.com/groups/groupname之类的东西,并调用www.example / groupdetail.php?gname = groupname。 它工作得很好。

但groupdetail.php上的所有相关链接都使用groups /作为相对path,我不希望他们这样做。 我如何避免这种情况?

例如,当用户点击链接<a href="link.php"> groupdetail.php?gname = groupname时,他将被带到www.example / groups / link.php。 我想把用户带到www.example.com/link.php。

很明显,我想URL的用户看起来像“www.example.com/groups/groupname”,所以我不想使用[R] /redirect。

如果像我一样,在页面中有数百个相对链接,那么在<head>插入一个绝对路径(也可以使用relative)的<base href=""> 。 您还需要在<head> .js文件的路径,因为IE和firefox处理基础href的方式不同。 我同意这是一个令人讨厌的问题。

相关链接由浏览器解析,而不是服务器,所以mod_rewrite没有什么可以做的。

可以使用相对链接( ../link.php )或使用绝对链接。

如果你不想拥有绝对的链接或者使用<base>因为你要移动页面,你可以通过php生成基本的代码,如下所示:

 echo '<base href="http://'.$_SERVER['SERVER_NAME'].str_replace("index.php","",$_SERVER['PHP_SELF']).'" />'; 

如果您更改rewite规则以执行强制重定向 (添加[R]选项),则浏览器将使用/groupdetail.php URL,相关链接将正常工作。 但是,这增加了一个重定向,并使网址不那么漂亮。

 RewriteRule ^groups/([^/.]+)/?$ groupdetail.php?gname=$1 [L,NC,R] 

如果你不想使用绝对路径,你可以使用BASE标签:

http://www.w3schools.com/tags/tag_base.asp

Hop的答案是正确的。 浏览器将www.example.com/groups/groupname视为地址,因此认为/groups是当前目录。 所以,像<a href=link.php>这样的任何链接都假定在/groups文件夹中。

当用户将鼠标移动到链接上时,他会将www.example.com/groups/link.php作为链接地址。

解决方案是使用绝对链接 – 只需在href之前添加一个斜杠即可:

<a href=/link.php>

用户将会看到www.example.com/link.php为网址。

这就是说,从你的问题来看,你正在使用相对链接…你有没有理由不使用绝对链接?