2017-01-27 1 views
1

У меня возникла проблема, которая не кажется новой или захватывающей, но из всех ответов, которые я нашел, никто не работает. Я чувствую, что программирование на .htaccess есть миллион способов решения проблемы, но я никогда не смогу найти/использовать правильный.HTACCESS: требуется переписать URL-адрес ссылки привязки URL-адрес

Я хотел бы взять уже чистый URL:
http://example.com/page/link

и сделать внутреннюю перезапись на:
http://example.com/page#link

Мои источники, прежде чем спросить:

  • http://stackoverflow.com/questions/21391449/how-to-use-sign-as-an-anchor-while-url-rewriting-with-htaccess-on-apache
  • http://stackoverflow.com/questions/29165917/htaccess-rewrite-url-to-hash-anchor-on-homepage
  • http://stackoverflow.com/questions/2686075/mod-rewrite-with-anchor-link
  • http://stackoverflow.com/questions/2285193/htaccess-redirect-to-page-with-anchor-link

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

Вы можете найти мой текущий файл .htaccess здесь: http://pastebin.com/xJWHq70f

ПРИМЕЧАНИЕ: веб-хостинга является Netfirms. Я отключил Nethirms по умолчанию .htaccess foolery.

Так что, чтобы повторить, я пытаюсь сделать чистый URL и дальше разбирать и переписывать со страницы/теста на страницу # test. Последняя строка в моей .htaccess действительно были

RewriteRule^о-я /(.*)$/о-я # $ 1 [NE, R] (не работает)

В теории создании ссылка на страницу с about-me/who-am-i должен взять меня к http://example.com/about-me#who-am-i, сохраняя при этом адресную строку, глядя, как http://example.com/about-me/who-am-i. В это время у меня есть одна конкретная страница, на которой я бы хотел, чтобы эта перезапись была включена для страницы about-me.php.

Спасибо,
Doug

PS
Извините за не 10+ репутации, поэтому я могу поместить все ссылки обычно

UPDATE 27 Jan 2016

Дальнейшего рассмотрения и дальнейшее расследования доказывает, что я бы хотел сделать просто не могу. Нет проблем. Я переключил передачу и изменил способ работы моей навигационной системы.

Вместо этого я буду использовать страницу about-me в качестве базы и создать необходимые необходимые страницы. Поскольку на странице много текста, лучше разбить его на более приятные для чтения разделы - теперь отдельные страницы.

Используя идею, представленную William, я смог быстро собрать решение. Мой исходный код .htaccess, чтобы удалить расширение .php, а затем перенаправить расширение .php на эквивалент без расширения, был сломан и вызвал 500 ошибок. ИСПРАВЛЕНО!

Используя следующий код:

RewriteRule ^about-me/(.*) /$1 [L,NC] 

Я могу иметь любой URL о-я/Статистика или о -мне/testing123 и до тех пор, как фактический stats.php или testing123.php существует в корне, он будет внутренне перенаправлен должным образом - сохраняя хороший чистый URL-адрес, а 404-й, если файл не существует.

+1

Насколько я знаю, привязывающие метки обрабатываются на стороне клиента, чтобы позволить перейти к разделу страницы. Если вы сделаете внутреннюю переписку, клиент этого не узнает. – apokryfos

ответ

0

Ok главное, чтобы убедиться, что вы делаете внутреннюю переписывают, а не внешний переписывают

Так что это будет работать:

RewriteRule ^page/(.*) /page#$1 [L] 

Убедитесь, что вы не добавляете [R = 301] флаг (или любое другое значение для R) или он даст ответ клиенту. Согласно RFC 3986 и RFC 1738, идентификатор фрагмента удаляется клиентами при разыменовании URI.

EDIT

Хотя Apache перепишет URL, чтобы включить фрагмент, PHP, вероятно, блевать. В соответствии с RFC 1738:

Символ «#» является небезопасным и всегда должны быть закодированы, потому что это используется в World Wide Web и в других системах, чтобы разграничивать URL из фрагмента/идентификатор якорного, который может последовать это ... Все небезопасные символы всегда должны быть закодированы в URL-адресе ... Например, символ «#» должен быть закодирован в URL-адресах даже в системах, которые не обычно имеют дело с идентификаторами фрагментов или якорей, так что если URL копируется в другую систему, которая их использует, для изменения кодировки URL-адреса не требуется .

Поэтому вам нужно избежать фрагмента, если вы хотите, чтобы PHP безопасно разбирал его.

+0

Эй, Уильям, я просто попробовал этот сниппет и по-прежнему получал 500 ошибок. Я даже попытался удалить все другие кодировки .htaccess и просто сохранил эту единственную строку перезаписи. –

+0

Вы уверены, что 500 не вернется с сервера PHP. Идентификатор фрагмента может заставлять его выдавать ошибку, так как технически он должен быть экранирован, чтобы квалифицировать его как URL-адрес. Как вы передаете URL-адрес в PHP? –

+0

Быстрое обновление: я получил ваш код для работы, вроде, как в случае ошибки более 500. Я добавил свой полный код .htaccess и прокомментировал раздел, который у меня есть для чистых URL-адресов. Итак, теперь, если я использую:
RewriteRule^about-me.php /(.*) /about-me.php#$1 [L] он приводит меня на страницу about-me.php (nice), показывает URL-адрес в качестве примера .com/about-me.php/test (очень приятно), но теперь просто сидит в верхней части страницы, а не позволяет браузеру спрыгнуть на якорь. Что-то очень не так с моим чистым URL-кодом ... –