当使用重写规则时,请说:
RewriteRule ^foo/(.+?)/?$ index.php?type=foo&value=$1 [NC,L]
客户端仍将此视为网址server.dom/foo/bar/
(它不知道这些网址是如何在内部解析的,这当然是合理的。)
如果页面index.php
生成链接(<a href="baz">link</a>
),则客户端会将其解释为server.dom/foo/bar/baz
。但是,index.php
在许多情况下还没有完全了解网址来自哪里......
第一个想法是将“虚拟”路径的深度作为参数传递。因此,重写规则将类似于:
RewriteRule ^foo/(.+?)/?$ index.php?type=foo&depth=2&value=$1 [NC,L]
因此,index.php
应该写:
<base href="../../">
或者更正式depth
次..
(以斜杠分隔)。但是,在某些情况下,.htaccess
也不了解“虚拟”路径的深度。此外,可以注意到重写规则中的最后一个斜杠(/
)是可选的,这取决于斜杠是否被记下,深度是否变化。这会显着增加RewriteRules
的数量......
有什么好的/更好的做法可以有力地解决这个相对链接问题(可能是因为移动网站的某些部分不会“破坏”链接)?
答案 0 :(得分:2)
如果您使用漂亮的链接,我强烈建议不要使用相对链接。您可以使用以下链接:
<a href="<?php base(); ?>baz">link</a>
其中base()
函数在某些config.php
中定义为输出/foo/
。
这样,链接将解析为/foo/baz
而不是/foo/bar/baz
。如果您必须将网站移至其他路径,请更新base()
内的config.php
功能。这与许多CMS框架像Wordpress或CakePHP一样。