Когда кто-то использует правило перезаписи, скажите:
RewriteRule ^foo/(.+?)/?$ index.php?type=foo&value=$1 [NC,L]
Клиент все еще видит это как URL server.dom/foo/bar/
(он не знает, как эти URL-адреса разрешаются внутри, что, конечно, разумно).
Если страница index.php
однако сгенерировать ссылку (<a href="baz">link</a>
), клиент будет интерпретировать это как server.dom/foo/bar/baz
, index.php
однако во многих случаях нет полного знания о том, откуда происходит URL-адрес …
Первой идеей было передать глубину «виртуального» пути в качестве параметра. Таким образом, правило перезаписи будет примерно таким:
RewriteRule ^foo/(.+?)/?$ index.php?type=foo&depth=2&value=$1 [NC,L]
В следствии, index.php
следует написать:
<base href="../../">
Или более формально depth
раз ..
(разделены косой чертой). Однако в некоторых случаях .htaccess
не знает о глубине «виртуального» пути. Кроме того, можно отметить, что последний слеш (/
) в правиле перезаписи необязательно, в зависимости от того, была ли записана косая черта, глубина меняется. Это увеличит количество RewriteRules
значительно …
Каковы хорошие / лучшие практики для надежного решения этой проблемы относительных связей (возможно, в том смысле, что перемещение части сайта не будут «ломать» ссылки)?
Если вы используете красивые ссылки, я настоятельно рекомендую не использовать относительные ссылки. Вы можете использовать ссылки как:
<a href="<?php base(); ?>baz">link</a>
где base()
функция определяется в некоторых config.php
выводить /foo/
,
Таким образом, ссылка будет разрешена на /foo/baz
вместо /foo/bar/baz
, Если вам нужно переместить ваш сайт на другой путь, просто обновите ваш base()
функционировать внутри вашего config.php
, Это то же самое, что делают многие фреймворки CMS, такие как WordPress или CakePHP.
Других решений пока нет …