Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Редактирование файла .htaccess

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Решения задач по теме .htaccess
tol64
Отправлено: 08 Сентября, 2019 - 10:04:19
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Сент. 2019  


Помог: 0 раз(а)




Добрый день.

К сожалению, не смог решить задачу самостоятельно. Прошу помочь разобраться. Тренируюсь на локальном сервере.


Задача

Нужно преобразовать адрес вида:

    http://localhost/GetSQL/users/profile?user=tol64


в адрес вида:

    http://localhost/GetSQL/users/tol64


//---

Перепробовал множество различных вариантов. Ничего не помогает.
Либо всё остаётся, как есть. Либо ошибка 404.


(Добавление)
Одна из попыток приводящая к ошибке 404:

    RewriteRule ^users/(.*)$ /profile?user=$1


А вот этот вариант ошибок не выдаёт, но ничего не изменяет в адресной строке:

    RewriteRule ^/users/(.*)$ /profile?user=$1

(Отредактировано автором: 08 Сентября, 2019 - 11:29:47)

 
 Top
teleoperator27
Отправлено: 08 Сентября, 2019 - 12:30:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 265
Дата рег-ции: Янв. 2017  


Помог: 21 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. RewriteEngine On
  3. RewriteRule ^/GetSQL/users/(.*)$ /GetSQL/users/profile?user=$1 [L]
 
My status
 Top
tol64
Отправлено: 08 Сентября, 2019 - 14:24:39
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Сент. 2019  


Помог: 0 раз(а)




teleoperator27 пишет:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. RewriteEngine On
  3. RewriteRule ^/GetSQL/users/(.*)$ /GetSQL/users/profile?user=$1 [L]


К сожалению, не помогло.
(Добавление)
Задача

Нужно преобразовать адрес вида:

    http://localhost/site/users/profile


в адрес вида:

    http://localhost/site/users/tol64


, но без перезагрузки страницы.

//---

Сейчас реализовано так, что при наведении курсора на ссылку показывается адрес

    http://localhost/site/users/tol64


, но переход осуществляется по

    http://localhost/site/users/profile.php


То есть в html вместо profile в ссылку подставляется никнейм авторизованного пользователя:

    <a class="profile" href="/site/users/<?php echo @$_SESSION['logged_user']; ?>">


, а при обработке клика по ссылке в javascript подменяем ссылку для перехода к нужному php-скрипту:

    const user_link = document.querySelector('.profile');
    if (user_link != undefined) {
    user_link.onclick = function() {
    this.href = 'http://localhost/site/users/profile';
    };
    }


В файле .htaccess есть преобразование убирающее расширение .php

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php


Перепробовал множество различных вариантов. Ничего не помогает. Либо всё остаётся, как есть. Либо ошибка 404.

Одна из попыток приводящая к ошибке 404:

    RewriteRule ^users/(.*)$ /profile?user=$1


А вот этот вариант ошибок не выдаёт, но ничего не изменяет в адресной строке:

    RewriteRule ^/users/(.*)$ /profile?user=$1


Файл .htaccess находится в корневой директории:

    http://localhost/site


Как можно решить эту задачу? Может быть есть другие способы без редактирования .htaccess?

P.S. >

Попробовал применить предложенные на других сайтах решения. К сожалению это не дало нужно результата. Опишу, что сделал и что получил на этот раз.

В файле .htaccess теперь не производится попытки преобразования ссылки.

JS-код обработки клика на ссылке профиля пользователя теперь выглядит вот так:

    const user_link = document.querySelector('.profile');
    if (user_link != undefined) {
    user_link.onclick = function() {
    //--- Получаем никнейм из содержания элемента
    let user_name = this.innerText;
    //--- Блокируем переход по ссылке
    this.href = '#';
    //--- Добавляем в историю путь, который нужно отобразить в адресной строке
    window.history.pushState(null, null, "/site/users/" + user_name);
    //--- Подготовка запроса для сервера
    var xhr = AjaxRequest();
    //--- Путь к файлу с содержимым профиля
    let path = '/site/users/profile';
    //--- Асинхронный (true) GET-запрос для *.php
    xhr.open("GET", path, true);
    //--- Ожидаемый тип ответа
    xhr.responseType = 'text';
    //--- Запрос данных
    xhr.send();
    //--- Обработка ответа от сервера
    xhr.onload = function () {
    //--- Вернуться в истории на шаг назад
    window.history.back();
    //--- Переписать страницу присланным html-кодом от сервера
    document.write(xhr.response);
    }
    };
    }


После нажатия на ссылке профиля пользователя сначала блокируется переход по ней:

    this.href = '#';


и, если при обработке ответа от сервера не произвести шаг назад:

    window.history.back();


, то в адресной строке увидим следующий результат:

    http://localhost/site/users/tol64#


Шаг назад убирает символ #, но иногда видно, как он мигает.

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

Есть ли, какие-то общие правила, которые бы помогли реализовать описанную схему без таких проблем? Может быть, кто-нибудь порекомендует книгу, где описывается подобное, чтобы не изобретать велосипед? На многих сайтах такое реализовано.
 
 Top
miketomlin
Отправлено: 10 Сентября, 2019 - 14:02:43
Post Id


Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июль 2016  


Помог: 5 раз(а)




Нормально имя файла-обработчика напиши в подстановке правила (profile.php, т.е. с расширением).

tol64 пишет:
Файл .htaccess находится в корневой директории:

http://localhost/site
Если у тебя каталог site должен быть корнем сайта, сделай его таковым. //localhost/site1/, //localhost/site2/ и т.п. для разных сайтов – это полная хрень.

tol64 пишет:
Как можно решить эту задачу? Может быть есть другие способы без редактирования .htaccess?
Да. Называется единая точка входа. Файл .htaccess с директивами mod_rewrite используется по минимуму или не используется вообще.
(Добавление)
P.S. На том же сайте про REST-адресацию можешь почитать. Это классика для твоего случая – использовать адреса вроде /users/tol64 (можешь глянуть мою демку для /articles).

(Отредактировано автором: 10 Сентября, 2019 - 14:11:00)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Apache и другие веб-серверы »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB