2010-05-20 2 views
12

У меня есть ситуации, где я хочу взять следующий URL:Как использовать Htaccess переписать URL для HTML тега привязки (#)

/1/джон

и иметь его перенаправить используя файл Htaccess в Apache чтобы перейти к

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

так, что он идет к HTML якорь с именем Иоанна.

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

ответ

0

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

+0

Я проверяю это на практике и считаю, что вы правы. Браузер интерпретирует привязки и прокрутки до нужной точки на странице; перенаправление Apache не в состоянии сделать это, потому что перенаправленный URI не передается в браузер. –

2

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

I just quickly found this well explained blog post for you, я надеюсь, что он может помочь вам с learning to rewrite URLs-part.

Что касается # -thing (ожидая, что теперь вы знаете, о чем я говорю), я не вижу проблемы с передачей одной и той же переменной дважды переписанному 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 

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

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

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

+0

Hi Sune, спасибо за ответ. Однако я не думаю, что то, что я пытаюсь сделать, возможно. См. Ответ на этой странице из nikc. –

19

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

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

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

4

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

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

+1

+1 Вы правы. Браузер сделает это. –

+1

К оригинальному плакату: укажите правильный ответ, чтобы решить эту проблему. –

+0

Хмм .. с Apache 2.4.25, я указываю относительную страницу и все равно получаю внешнюю переадресацию на привязывающий тег. Возможно, с 2013 года ситуация изменилась? В разделе «RewriteBase»/​​«' then «RewriteRule^services /? $ #services [L, R = 301, NE]' работает для меня. Что хорошо, если мне не нужно повторять правила при переходе на https. –

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