Php изменить url в строке запроса браузера
Как бы у меня есть на JavaScript действие, которое может иметь некоторые эффекты на текущей странице, но также изменит URL-адрес в браузере, так что, если пользователь нажимает перезагрузить или закладки новый URL используется?
Я пытаюсь записать состояние JavaScript в URL.
если вы хотите работать в браузерах, которые не поддерживают history.pushState и history.popState тем не менее," старый " способ-установить идентификатор фрагмента, который не вызовет перезагрузку страницы.
основная идея состоит в том, чтобы установить window.location.hash свойство для значения, содержащего любую необходимую информацию о состоянии, затем либо используйте
С HTML 5, Используйте history.pushState функции. В качестве примера:
если вы хотите изменить URL-адрес без добавления записи в список кнопки "назад", используйте .
Я бы сильно подозревал, что это невозможно, потому что это было бы невероятной проблемой безопасности, если бы это было. Например, я мог бы сделать страницу, которая выглядела как страница входа в банк, и сделать URL-адрес в адресной строке так же, как реальный банк!
возможно, если вы объясните, почему вы хотите это сделать, люди могут предложить альтернативные подходы.
[Edit in 2011: так как я написал этот ответ в 2008 году, больше информации пришло свет относительно техника в HTML5 это позволяет изменять URL-адрес, если он из того же источника]
настройки безопасности браузера не позволяют людям напрямую изменять отображаемый url-адрес. Вы можете себе представить уязвимости фишинга, которые могли бы вызвать.
при этом я часто просто использовать ссылки для действий с хэшем как href, затем добавьте события click с jquery, которые используют запрошенный хэш для определения и делегирования действия.
Я надеюсь, что это ставит вас на правильный путь.
jQuery имеет отличный плагин для изменения URL браузеров, называемый в jQuery-толкатель.
JavaScript pushState и jQuery можно использовать вместе, например:
history.pushState(null, null, $(this).attr('href'));
пример:
пример:
window.history.pushState("object", "Your New Title", "/new-url");
метод pushState ():
pushState() принимает три параметра: объект состояния, заголовок (который в настоящее время игнорируется) и (необязательно) URL. Рассмотрим каждый из этих трех параметров более подробно:
состояние объекта - объект состояния является объектом JavaScript, который связан с новая запись истории, созданная pushState() . Всякий раз, когда пользователь переходит в новое состояние, запускается событие popstate, и свойство state события содержит копию объекта state записи журнала.
объектом состояния может быть все, что может быть сериализовано. Поскольку Firefox сохраняет объекты состояния на диск пользователя, чтобы их можно было восстановить после перезагрузки браузера, мы накладываем ограничение размера 640k символов на сериализованное представление объекта состояния. Если вы передайте объект состояния, сериализованное представление которого больше этого в pushState() , метод выдаст исключение. Если вам нужно больше места, рекомендуется использовать sessionStorage и / или localStorage.
заголовок - в настоящее время Firefox игнорирует этот параметр, хотя он может использовать его в будущем. Передача пустой строки здесь должна быть безопасной от будущих изменений метода. Кроме того, вы можете передать короткий заголовок для состояние, в которое вы переходите.
URL-адресом - URL новой записи истории задается этим параметром. Обратите внимание, что браузер не будет пытаться загрузить этот URL-адрес после вызова pushState() , но он может попытаться загрузить URL-адрес позже,например, после перезагрузки браузера. Новый URL-адрес не должен быть абсолютным; если он относителен, он разрешен относительно текущего URL-адреса. Новый URL-адрес должен иметь то же происхождение, что и текущий URL-адрес; в противном случае, pushState() выдаст исключение. Этот параметр является необязательным; если он не указан, он имеет значение текущего URL-адреса документа.
Я знаю, что могу сделать это с помощью PHP, просто читая URL-адрес и записывая Ajax на лету, но при этом вся страница будет каждый раз перезагружаться. Есть ли способ сделать это без перезагрузки всей страницы? Я думаю, мне нужно, чтобы в подменю была постоянная привязка, например, указывающая на "http://mysite.com / contact-us ", но при нажатии, вместо того, чтобы открывать эту страницу, обработайте запрос Ajax.
И если это возможно, Google, вероятно, сочтет это черной шляпой, верно?
С уважением, Алекс
Как тогда Shopify это делает? Перейдите на их веб-сайт, нажмите ссылку «Функции», и вы увидите, что URL-адрес гласит:
Затем щелкните любую из дополнительных ссылок, и вы увидите, что адрес в URl изменяется без использования хеша, но нет перелистывания страницы.
Я не думаю, что они используют ajax для изменения содержимого, потому что все это, похоже, включено в скрытые div на странице, но, тем не менее, вы, по-видимому, можете изменить URL-адрес, используя уловки на стороне клиента.
Похоже, это должно быть выполнено с помощью механизма перезаписи, но при условии, что у вас есть веская причина для используйте AJAX, вы можете изменить URL-адреса с помощью javascript, изменив часть после хэша или, что еще лучше, хеш-банга:
Это проблема маршрутизации, а не проблема AJAX.
И направил их, скажем,
Обычно это достигается с помощью механизма перезаписи при использовании вне хорошей системы URL-адресов MVC или RESTful. Я использую ISAPI Rewrite в IIS, но если вы работаете со стеком LAMP, я думаю, что Apache предоставляет модуль, который предоставляет те же возможности. (Google .htaccess )
ВНИМАНИЕ: ПОСЛЕДУЮЩИЕ СЛЕДУЮЩИЕ
И, чего бы это ни стоило,
Не пытайтесь написать все свое приложение на JavaScript. Сервер здесь по какой-то причине. Часть вашей работы как веб-разработчика - взять на себя как можно больше работы на своем сервере. Проблемы с производительностью и совместимостью браузера сведут вас с ума, если вы попытаетесь сделать все на клиенте.
Избегать обратных передач имеет смысл во многих обстоятельствах, но это не лучшая панацея, которую вы должны применять к каждой странице. Обычно имеет смысл загружать новую страницу при нажатии на ссылку. Это то, чего ожидает пользователь, он более стабилен (поскольку большая часть необходимой инфраструктуры находится на стороне сервера) и не медленнее, чем запрос AJAX для получения того же самого.
Добавьте в корневую папку файл с именем .htaccess и добавьте что-то вроде этого:
Это скажет Apache, чтобы включить mod_rewrite для этой папки, и если ему будет задан URL-адрес, соответствующий регулярному выражению, он переписывает его внутри того, что вы хотите, без того, чтобы конечный пользователь его видел. Легко, но негибко, поэтому, если вам нужно больше энергии:
Маршрут PHP
Поместите вместо этого в свой .htaccess:
Это сообщит, чтобы он запускал ваш index.php для всех файлов, которые он обычно не может найти на вашем сайте. Тогда вы можете:
Вот как это делают большие сайты и CMS-системы, поскольку это позволяет гораздо большую гибкость в анализе URL-адресов, конфигурационных и зависимых от базы данных URL-адресов и т.д. Для спорадического использования жестко закодированные правила перезаписи в .htaccess сделают все возможное.
Ответ 2
Если вы хотите изменить маршрут для picture.php , то добавление правила перезаписи в .htaccess будет отвечать вашим потребностям, но если вы хотите переписать URL-адрес, как в Wordpress, то PHP - это способ. Вот простой пример для начала.
Структура папки
В корневой папке есть два файла, .htaccess и index.php , и было бы неплохо разместить остальные файлы .php в отдельной папке, например inc/ .
.htaccess
Этот файл имеет четыре директивы:
index.php
Поскольку все теперь перенаправлено на index.php, будет определено, правильно ли URL-адрес, все параметры присутствуют, и если тип параметров правильный.
Чтобы проверить URL-адрес, нам нужно иметь набор правил, и лучшим инструментом для этого является регулярное выражение. Используя регулярные выражения, мы ударим двух мух одним ударом. Url, чтобы пройти этот тест, должны иметь все необходимые параметры, которые проверяются на допустимых символах. Вот несколько примеров правил.
Далее нужно подготовить запрос uri.
Теперь, когда у нас есть запрос uri, последний шаг - проверить uri на правила регулярных выражений.
Успешное совпадение будет, поскольку мы используем именованные подшаблоны в регулярном выражении, заполняем массив $params почти таким же, как PHP заполняет массив $_GET . Однако при использовании динамического url массив $_GET заполняется без каких-либо проверок параметров.
Эти несколько строк кода и базовое знание регулярных выражений достаточно для создания надежной системы маршрутизации.
Полный источник
Ответ 3
это файл .htaccess, который пересылает почти все в index.php
тогда вам нужно разобрать $_SERVER [ "REQUEST_URI" ] и перейти к picture.php или другому
Ответ 4
PHP не то, что вы ищете, посмотрите mod_rewrite
Ответ 5
Хотя уже ответили, и автор намерен создать приложение типа front controller, но я отправляю буквальное правило для заданной проблемы. если у кого-то проблема такая же.
Добавьте файл с именем .htaccess в вашу корневую папку и добавьте что-то вроде этого:
Это скажет Apache включить mod_rewrite для этой папки, и если он получит запрос на URL-адрес, соответствующий регулярному выражению, он внутренне переписывает его на то, что вы хотите, чтобы конечный пользователь этого не видел. Легко, но негибко, поэтому, если вам нужно больше мощности:
Маршрут PHP
Вместо этого поместите в свой .htaccess следующее: (обратите внимание на ведущую косую черту)
Это скажет ему запустить ваш index.php для всех файлов, которые он обычно не может найти на вашем сайте. Там вы можете, например,:
Именно так это делают большие сайты и CMS-системы, потому что это дает гораздо большую гибкость в синтаксическом анализе URL-адресов, URL-адресов, зависящих от конфигурации и базы данных, и т. Д. Для спорадического использования жестко запрограммированные правила перезаписи подойдут .htaccess .
Удобно для небольших сайтов, но не очень практично, если вам нужно разбирать /blog/25 так же, как /picture/51 и /download/684 . Кроме того, это считается очень плохой практикой (и вы будете наказаны за PR в Google!), Если не все случайно сгенерированные URL-адреса будут правильно возвращать 404. по крайней мере, в моей системе это было FallbackResource /index.php (обратите внимание на косую черту) вы должны использовать if($elements[0] === NULL) вместо этого, поскольку $elements все равно будет возвращать счетчик, равный единице, даже если он пуст.Если вы хотите изменить только маршрут, picture.php тогда добавление правила перезаписи .htaccess будет соответствовать вашим потребностям, но если вы хотите, чтобы URL-адрес переписывался, как в Wordpress, то подходящим вариантом является PHP. Вот простой пример для начала.
Структура папки
В корневой папке нужны два файла, .htaccess и index.php , а остальные .php файлы было бы хорошо поместить в отдельную папку, например inc/ .
.htaccess
В этом файле четыре директивы:
index.php
Поскольку теперь все перенаправлено на index.php, будет определено, правильный ли URL-адрес, все параметры присутствуют и правильный ли тип параметров.
Чтобы проверить URL-адрес, нам нужен набор правил, и лучший инструмент для этого - регулярное выражение. Используя регулярные выражения, мы убьем двух мух одним ударом. URL-адрес для прохождения этого теста должен иметь все необходимые параметры, которые проверяются на разрешенные символы. Вот несколько примеров правил.
Далее следует подготовить запрос uri.
Теперь, когда у нас есть URI запроса, последний шаг - проверить URI в правилах регулярных выражений.
Успешное совпадение, поскольку мы используем именованные подшаблоны в регулярном выражении, заполнит $params массив почти так же, как PHP заполняет $_GET массив. Однако при использовании динамического URL-адреса $_GET массив заполняется без каких-либо проверок параметров.
Этих нескольких строк кода и базовых знаний о регулярных выражениях достаточно, чтобы начать построение надежной системы маршрутизации.
Читайте также: