Я ожидаю, что ответ будет таким простым, что мне захочется плакать, но я не могу понять это. Я новичок в mod_rewrite.
Я хотел изменить свои ссылки с таких вещей, как domain.com/?p=about, на domain.com/about* / * (с завершающей косой чертой), и он отлично работает, но всякий раз, когда я перехожу к ссылке, она добавляет новые ссылку на обратную ссылку. Например, у меня есть связь и контактная ссылка. Если я нажму на него, перейдет к domain.com/about/, то, если я нажму контакт, он перейдет к domain.com/about/contact/ и продолжит добавлять ссылки в конец URL-адреса. Если я нахожусь в домене.com и нажимаю ссылку (примерно в этом случае), она перейдет на домен.com/about/, и если я нажму еще 4 раза, в моей адресной строке будет указано «domain.com/ about / about / about / about / about / "Я воспроизвел это в очень простом примере ниже, что я делаю неправильно?
RewriteEngine On RewriteRule ([a-zA-Z0-9]+)/$ index.php?p=$1
index.php
<a href="about/">about</a> | <a href="contact/">contact</a><br><br> <?php if(!isset($_GET['p'])) { echo "home"; } else { echo $_GET['p']; } ?>
Спасибо за помощь!
edit: Он работает нормально, если я использую абсолютный путь, но я бы предпочел, если мне не обязательно.
edit2: добавление
RewriteBase /
ломает ссылки. Они, кажется, идут в domain.com/about/ и … / contact /, но я получаю 404 – я предполагаю, что правило, которое я использовал, как-то несовместимо с тем, как я делаю свою связь, а потому Я также включил index.php.
Вы определяете все свои ссылки в HTML относительно текущего пути.
Вам нужно будет изменить свои ссылки таким образом, чтобы:
<a href="about/">about</a> | <a href="contact/">contact</a><br><br>
становится (обратите внимание на листинг / на URL):
<a href="/about/">about</a> | <a href="/contact/">contact</a><br><br>
Когда вы находитесь на странице site.com/about/us
например ссылку <a href="home/"
разрешается браузером быть site.com/about/us/home
.
Решение состоит в том, чтобы изменить все ваши ссылки, изображения, таблицы стилей и javascripts, чтобы использовать абсолютные пути в ваших URL-адресах, а не относительные, например, у вас есть.
EDIT: Просто заметили ваше редактирование. Вы действительно должны использовать абсолютные пути, а не относительные. Если вы хотите сохранить относительные URL-адреса, вам придется использовать что-то вроде <base href="/" />
на всех ваших страницах.
Независимо от того, что вы делаете, нажатие <a href="about/">about</a>
будет добавлено в about/
в конец URL-адреса. Вот как работают относительные ссылки.
Ваш выбор в порядке разумности:
Просто удалите эту конечную косую черту. В этом причина вашей проблемы:
<a href="about">about</a>
Относительная ссылка заменит последний раздел пути (после последнего /
) новым значением.
Добавьте предыдущий ../
. Это немного взломано, но это позволяет сохранить эту ценную косые черты
<a href="../about/">about</a>
Сделайте 301 переадресацию из /about/about
to /about
. Это приведет к тому, что адресная строка изменится с /about
на /about/about
и обратно.
Может быть, слишком поздно ответить, но добавление этой строки в раздел <head>
сделает трюк:
<base href="/"> or <base href="your-domain-name">