Как использовать htaccess, чтобы переписать URL в HTML-тег привязки (#) - PullRequest
15 голосов
/ 20 мая 2010

У меня есть ситуация, когда я хочу взять следующий URL:

/ 1 / джон

и перенаправить его с помощью файла Apache htaccess, чтобы перейти на

/ page.php? ID = 1 & имя = джон # джон

так, чтобы он перешел к html-якору с именем john.

Я нашел много ссылок на экранирование специальных символов и добавление флага [NE], чтобы перенаправление игнорировало знак #, но они не работают. Например, добавление [NE, R] означает, что URL просто отображается в адресе браузера как оригинал: http://example.com/page.php?id=1&name=john#john.

Ответы [ 4 ]

22 голосов
/ 24 ноября 2010

Это возможно при использовании флага [NE] (noescape).

По умолчанию специальные символы, такие как & и?, Например, будут преобразованы в эквивалент в шестнадцатеричном формате. Использование флага [NE] предотвращает это.

Подробнее http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne

4 голосов
/ 11 января 2013

Вы можете сделать одну из этих вещей, но не обе.

Вы можете использовать флаг [NE], чтобы указать Apache не экранировать символ «#», но чтобы перенаправление работало, вы должны указать абсолютный URL для перенаправления, а не просто относительную страницу. Apache не может сделать прокрутку окна до якоря за вас. Но браузер будет, если вы перенаправите на абсолютный URL.

2 голосов
/ 20 мая 2010

То, что вы хотите сделать, может быть выполнено с помощью переписывания URL-адреса или, в частности, улучшения URL-адреса.

Я только что быстро нашел этот хорошо объясненный пост в блоге для вас , я надеюсь, что он поможет вам с обучением переписывать URL-части .

Что касается # (ожидая, что вы теперь знаете, о чем я говорю), я не вижу проблемы в передаче одной и той же переменной в переписанный URL дважды. Как: (обратите внимание на последнюю часть первой строки)

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$  /$1/$2/#$2 [R]
RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)/$ /index.php?page=$1&subpage=$2

Хотя вам придется убежать от # -части, и кажется , что это можно сделать следующим образом:

RewriteRule ^([a-zA-Z0-9_]+)/([a-zA-Z0-9_]+)$  /$1/$2/\%23$2 [R,NE]

Кстати, перезапись URL-адреса не , что сложно (но может стать сложным, и я не эксперт), но Google может сильно помочь в этом.

0 голосов
/ 20 мая 2010

Вы не можете выполнить внутреннее перенаправление на якорь. (Только подумайте: как бы Apache прокрутил бы вниз до якоря?) Ваша ссылка должна указывать на /1/john#john. Якоря не являются частью запроса.

...