2014-10-13 2 views
1

Когда один использует правило перезаписи, скажем:Переписать правила и базовый URL

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 однако во многих случаях не имеет полного знания о том, откуда происходит исходный код ...

Первой идеей было передать глубину «виртуального» пути в качестве параметра. Таким образом, правило перезаписи будет что-то вроде:

RewriteRule ^foo/(.+?)/?$ index.php?type=foo&depth=2&value=$1 [NC,L] 

В результате index.php должен написать:

<base href="../../"> 

Или более формально depth раз .. (разделенных косой чертой). Однако в некоторых случаях .htaccess не знает о глубине «виртуального» пути. Кроме того, можно заметить, что последний слэш (/) в правиле перезаписи является необязательным, в зависимости от того, записана ли косая черта, глубина изменяется. Это приведет к увеличению числа RewriteRules значительно ...

Каких хорошие/лучшие практики для решения этой проблемы относительной ссылки робастно (надежных, возможно, в том смысле, что двигающийся часть сайта не будет «перерыв» ссылка) ?

+0

Вы пытаетесь эмулировать абсолютные пути родственниками? И вы знаете о RewriteBase и теге? –

+0

Я бы сделал макрос C и создал расширение PHP, расположенное в '/ ext/YOUR_EXT_NAME' –

+0

@MichaelLivach: Ну, не знаю« корень »веб-сайта, поэтому абсолютные ссылки не являются опцией ... –

ответ

2

Если вы используете довольно ссылки, я бы настоятельно рекомендовал не использовать относительные ссылки. Вы можете использовать ссылки как:

<a href="<?php base(); ?>baz">link</a> 

где base() функция определена в некоторой config.php для вывода /foo/.

Таким образом, ссылка будет устранена до /foo/baz вместо /foo/bar/baz. Если вам нужно переместить свой сайт на какой-то другой путь, просто обновите свою функцию base() внутри своего config.php. Это то же самое, что и многие платформы CMS, такие как Wordpress или CakePHP.

+1

Возможно, неправильно -местную цитату в начале строки «baz» в вашем примере. – TML

+0

Да, это так, спасибо @TML: теперь он отредактирован. – anubhava

Смежные вопросы