#javascript #php #ajax #.htaccess
#javascript #php #ajax #.htaccess
Вопрос:
Вот как устроен мой сайт…
articles.php содержит HTML-макет для отображения всех статей для категории. articles.js содержит элементы управления для получения результатов запроса к БД и передачи в articles.php страница. Внутри js-скрипта находится таблица данных, которая отображается на articles.php страница. ajax_articles.php содержит запрос запроса и возвращает результаты запроса в формате json. В файле json есть ссылки на отдельные статьи. Ссылка структурирована как чистый SEO-URL (например, article/001/moby_dick).
Вот как я понимаю, как работает htaccess.
Когда пользователь выбирает статью, URL-адрес (т.е. https://www.example.com/article/001/moby-dick ) передается через htaccess и с RewriteRule ^article/([0-9] )/([ a-z_-] ) article.php?art_id=$ 1amp;art_name = $ 2 [NC, L] отобразит «симпатичный» URL для SEO, НО системе будет известен URL, содержащий два параметра, которые могут быть использованы a $ _GET для получения двух параметров. ПРАВИЛЬНО ЛИ Я ПОНИМАЮ ПРОЦЕСС?
Я заметил, что с htaccess я теперь должен использовать полное имя пути для загрузки поддержки (.js) и графических файлов. Кроме того, я не могу получить переменные через js $ _GET.art_id и $_GET.art_name.
Мы высоко ценим любую помощь.
Комментарии:
1. Это описание очень приблизительно соответствует, но не точное. Динамический конфигурационный файл («.htaccess») каким-то образом не может определить, какой URL-адрес отображается в браузере. Этот файл конфигурации работает на стороне сервера, URL-адрес отображается на стороне клиента. Как запрошенный, так и переписанный URL-адрес известны на стороне сервера, фактически это несколько переписанных URL-адресов запроса.
2. И
$_GET
не имеет никакого смысла в javascript.$_GET
является суперглобальной переменной внутри движка php , которая не имеет ничего общего с движком javascript. Один — на стороне сервера, другой — на стороне клиента, между ними очень мало соединений, только http-запросы, не более.3. Причина, по которой доступ ко всем вашим медиафайлам должен осуществляться через корневую папку или абсолютные URL-адреса, заключается в том, что браузер видит содержимое между косыми чертами как каталоги, даже если технически они не существуют. Как только вы вводите /article/001/moby-dick, браузер ищет /article/001 в качестве текущей папки.
4. Спасибо за ваши ответы. Я смог заставить один из модулей работать, но у меня все еще возникают проблемы с другими. Что касается $ _GET в js, обратите внимание на мой комментарий в конце моего вопроса. Не помню, где я это нашел, но я использую следующий код js $ _GET уже несколько лет. var $_GET = {0:0}; document.location.search.replace (документ.местоположение.поиск.замена)(/??(?:([^=] )=([^amp;]*)amp;?)/ g, функция () { ‘использовать строго’; функция decode(s) { возвращает decodeURIComponent(s.split(» «).join(«»)); } $_GET[decode(аргументы[1])] = decode(аргументы[2]); }); Еще раз спасибо!
5. Я начинаю понимать проблемы. Моя проблема сейчас в том, что я не могу использовать localhost для тестирования, учитывая, что ВСЕ ссылки на файлы должны использовать полный путь к файлу. Это может быть нормально для файлов изображений, но javascript, CSS, AJAX и другие находятся в подкаталогах основного сайта. Как я могу таким образом выполнить тестирование, если требуется полный путь?
Ответ №1:
Вы не можете получить доступ к GET
переменным с помощью javascript в этой конфигурации, потому что они не существуют после перезаписи URL. Параметры запроса были удалены.
Все еще существуют способы извлечения этих значений из URL с помощью window.location.href
и .split()
метода в javascript.
// var myurl = window.location.href; // this will get the string of your current URL. Used manual string in this example
var myurl = "https://www.example.com/article/001/moby-dick"; // manual URL for sake of an executable example
var spliturl = myurl.split("/"); // ["https:","","example.com","article","001","moby-dick"]
var articleid = spliturl[4]; // "001"
var articlename = spliturl[5]; // "moby-dick"
// see the variables in action
console.log("id: ", articleid);
console.log("name: ", articlename);