Xpoint
   [напомнить пароль]

ЧПУ .htaccess и знак вопроса

Метки: [без меток]
2009-03-17 18:04:21 [обр] Андрей[досье]

Доброго времени суток.
Ищу совет, помощь и решение такой проблемки)
Что есть.
В броузере http://127.0.0.1/-exit
в .htaccess правило
RewriteRule ^-([a-zA-Z0-9]+)$ index.php?view=main&act=$1
парсит, и выводит на страничку
view=main&act=exit
Все гуд и хорошо, так и должно быть.
Вопрос, как написать правило что бы заменить - на ?
если делаем так
http://127.0.0.1/?exit
в .htaccess
^\?([a-zA-Z0-9]+)$ index.php?view=main&act=$1
ответ получаем на страничке
view=main а
&act=exit куда то отваливается.

в пхп данные выводятся командой print $_SERVER["QUERY_STRING"]

Где грабли лежат)?

спустя 6 минут [обр] Андрей[досье]
ой, сори,
где тут редактировать?)
http://127.0.0.1/?exit
в .htaccess
^\?([a-zA-Z0-9]+)$ index.php?view=main&act=$1
ответ получаем на страничке
exit
а view=main&act= пропадает
спустя 5 минут [обр] Андрей[досье]
получается что правило в
в .htaccess
^\?([a-zA-Z0-9]+)$ index.php?view=main&act=$1
просто не срабатывает
спустя 3 часа 24 минуты [обр] Иванов Михаил aka Ivanych(3/70)[досье]

Да, не срабатывает. И не должно. Знак вопроса не является частью URL, с которым работает mod_rewrite. Знак вопроса - это разделитель между URL и параметрами. То, что идет после знака вопроса (включая сам знак вопроса), вообще не попадает на обработку в RewriteRule.

Откажитесь от использования знака вопроса. Используйте тире, как в Вашем первом примере, или какой-нибудь другой символ.

спустя 12 часов [обр] Филипп Ткачев(0/112)[досье]
Как насчет красивого и понятного ЧПУ?
http://127.0.0.1/exit/
спустя 4 часа 21 минуту [обр] Андрей[досье]
2 Иванов Михаил aka Ivanych[досье]
Благодарю, дошло), знак ? 100% нельзя использовать в данном случае.
2Филипп Ткачев[досье]
http://127.0.0.1/exit/
а как определить, это команда на исполнение, или запрос на просмотр странички?
в данном случае, какое это значение, view или act?
спустя 1 час 20 минут [обр] Филипп Ткачев(0/112)[досье]

Если это страничка, значит она существует на сервере.
Например

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ dispetcher.php?q=$1 [L,QSA]

перенаправит все запросы к несуществующим файлам на сервере на файл dispetcher.php. В параметре q сохранится весь путь.
Тогда ваш запрос можно представить в виде

http://127.0.0.1/main/exit/

переменная q=/main/exit.
Этот путь можно превратить в переменные

$q=trim($_GET['q'],"\/"); // обрезать лишние слеши
list($view,$act) = explode('/',$q); // превратить в 2 переменных
спустя 23 часа [обр] Андрей[досье]

2 Филипп Ткачев
Я разбираю сточку в .htaccess

http://127.0.0.1/page1/page2/.../pageN/par1=var1&par2=var2&par3=var3...parN=varN

и передаю уже разобраную строку в index.php

index.php?par1=var1&par2=var2&par3=var3 ...parN=varN

в пхп парсингом не занимаюсь, это реализовано в .htaccess
Вы наверно не поняли сути вопроса

  1. Знак вопроса адресной строке броузера. Выяслин, так не получится.

2.

http://127.0.0.1/main/exit/

как разобрать где запрос на просмотр, а где команда на исполнение (выход)
у меня пока такое решение

http://127.0.0.1/main/-exit

равносильно

http://127.0.0.1/main/act=exit

обе строки парсятся как
view=main&act=exit

на исполнение файла/функии

http://127.0.0.1/main/exec=test
спустя 19 минут [обр] Андрей[досье]
еще, гляньте пожалуйста .htaccess, не силен), буду рад выслушать замечания
RewriteEngine on

AddDefaultCharset windows-1251

Options +FollowSymLinks
DirectoryIndex index.php

#все запросы будут перенаправлены на index.php.
Action throw /index.php

<FilesMatch index.php>
ForceType application/x-httpd-php
</FilesMatch>

RewriteBase /

#lvl 1
# если пустая, то главная
RewriteRule ^$ index.php?view=main [L]

# парсит линки 1 уровня, и передает ёё в переменной view (/furl или  /furl/ -> view=furl )
RewriteRule ^([a-zA-Z0-9]+)/{0,1}$ index.php?view=$1 [L]

# парсит команду, и передает ёё в переменной act (/furl/-exit -> view=furl&act=exit )
RewriteRule ^-([a-zA-Z0-9]+)$ index.php?view=main&act=$1   [L]

# парсит передаваемые переменные после "/"(/act=delpost&id=666 -> view=main&act=delpost&id=666)
RewriteRule ^([a-zA-Z0-9\q=&\e]+)$ index.php?view=main&$1 [L]

#lvl 2
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9\q=&\e]+)$ index.php?view=$1&$2[L]
RewriteRule    ^([a-zA-Z0-9]+)/-([a-zA-Z0-9]+)$ index.php?view=$1&act=$2[L]

#Errors
ErrorDocument 404 /index.php?view=error&errorId=404.htaccess
спустя 39 минут [обр] Филипп Ткачев(0/112)[досье]

Андрей[досье], я понял, что вы делаете. Я не могу вникнуть в тайный смысл ваших действий.
Какая разница между

http://127.0.0.1/main/act=exit

и

http://127.0.0.1/main/?act=exit

С точки зрения моей логики - никакой. Если страницы содержат операции, то нет смысла для них делать ЧПУ. Путь к странице должен быть путем, а операция - параметрами.
По своей сути ЧПУ предполагает иерархию и задуман для того, чтобы пользователь мог стереть кусочек пути и подняться уровнем выше.

Кстати мой вышеприведенный пример позволяет сделать так

из
http://127.0.0.1/page1/page2/.../pageN/?par1=var1&par2=var2&par3=var3...parN=varN
получается
http://127.0.0.1/dispetcher.php?q=page1/page2/.../pageN/&par1=var1&par2=var2&par3=var3...parN=varN

В обработчике вы можете сами решить, что вы делаете. Это гораздо более гибкая схема, нежели ваша.

http://127.0.0.1/main/act/exit
http://127.0.0.1/main/exec/test
                 стр  |
                      операция

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

спустя 22 часа [обр] Андрей[досье]

2 Филипп Ткачев

Я не могу вникнуть в тайный смысл ваших действий.

Учусь), пишу сам)
1.

http://127.0.0.1/main/act=exit

и

http://127.0.0.1/main/?act=exit

На сколько я понял суть .htaccess, .htaccess примит параметры до ?, и проигнорирует строку с параметрами после ?.
На что и указывает в посте выше Иванов Михаил aka Ivanych.
2.

С точки зрения моей логики - никакой. Если страницы содержат операции, то нет смысла для них делать ЧПУ. Путь к странице должен быть путем, а операция - параметрами.

Дейсвие на стронице почти всегда какое то есть, допустим добавить пост.
Вопрос в том как это предаставить.
3.

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

Так и задумано, + еще пользователь может писать команду в страке броузера на исполнение
Допустим

http://127.0.0.1/main/?act=exit
http://127.0.0.1/main/news/sport/?act=exit
равносильно
http://127.0.0.1/main/-exit
http://127.0.0.1/main/news/sport/-exit

и допуситим означает выход из залогиненого юзера
стирание sport/ из

http://127.0.0.1/main/news/sport/
получаем страницу на показ
http://127.0.0.1/main/news/

на которой в свою очередь можно выполнять предусмотренные дейсвия, допустим

http://127.0.0.1/main/news/sport/act=delpost&id=123546

4.

В обработчике вы можете сами решить, что вы делаете. Это гораздо более гибкая схема, нежели ваша.
http://127.0.0.1/main/act/exit
http://127.0.0.1/main/exec/test

как определить?
- где команда будет act=exit
- где запрос на просмотр сраницы /main/act/exit
если совпадет по названиям просматривыемый каталог(станица) с командой (допустим act), что тогда?
жестко прописывать правила? теряется гибкость.

спустя 5 минут [обр] Андрей[досье]

Сори, без знака "?"

Так и задумано, + еще пользователь может писать команду в страке броузера на исполнение
Допустим

http://127.0.0.1/main/act=exit
http://127.0.0.1/main/news/sport/act=exit
равносильно
http://127.0.0.1/main/-exit
http://127.0.0.1/main/news/sport/-exit

фактически "-" озночает "act="

спустя 8 часов [обр] Филипп Ткачев(0/112)[досье]

Андрей[досье], я считаю, что вы сейчас запутываете сами себя.

IMHO, передавать действия удобнее методом POST и это маломальская защита от роботов (примитивная конечно, уж очень меня позабавила ссылочка http://127.0.0.1/main/news/sport/act=delpost&id=123546).
Туже форму добавления комментария (или чего-то другого небольшого) можно вставить внутри скрытого блока.
Если говорить о юзабилити, то здесь властвуют Ajax и DHTML. А ваши потуги с URL просто смешны. Все обычные люди ходят по ссылкам или нажимают на кнопки.
Если вы заставляете пользователя вводить адрес вручную, то юзабилити равно нулю.

http://127.0.0.1/main/-exit
http://127.0.0.1/main/news/sport/-exit

и

http://127.0.0.1/main/?exit
http://127.0.0.1/main/news/sport/?exit

Различаются кодом символа. Да это ведь разные переменные. Но получить их имена не составляет труда, поверьте.
Зато

http://127.0.0.1/main/news/sport/act=delpost&id=123546

превращается в изящное (и на которое всем наплевать, как и на строку выше)

http://127.0.0.1/main/news/sport/?delpost=123546

И по пунктам:

  1. Да, проигнорирует.
  2. Действие есть не всегда. Работать с ним удобнее, применяя метод POST.
  3. Пользователю всегда лень... Помните об этом.
  4. Согласен, не гибко. Однако вероятность совпадения с командой мала. И лечится очень легко. А правильное продумывание структуры сайта вообще имеет положительный момент.
спустя 2 дня 15 часов [обр] Андрей[досье]
Различаются кодом символа. Да это ведь разные переменные. Но получить их имена не составляет труда, поверьте.

я не знаю как это сделать через знак ? в .htaccess, это было основой вопрос

Действие есть не всегда. Работать с ним удобнее, применяя метод POST

Паральельно будет возможность посылать данные методами POST и GET, и возможноть применять Ajax технологии. Все эти возножности уже за выбором от конкретной ситуации. Я хочу предоставить эти возможности.

Если говорить о юзабилити, то здесь властвуют Ajax и DHTML. А ваши потуги с URL просто смешны. Все обычные люди ходят по ссылкам или нажимают на кнопки.

бр... а зачем вообще придумали такое понятие как ЧПУ?
По моему

http://127.0.0.1/main/news/sport/act=delpost&id=123546

лучше смотрится чем

http://127.0.0.1/index.php?wiew=main&wiew2=news&wiew3=sport&act=delpost&id=123546

или я не прав? или вы про что?

спустя 1 час 9 минут [обр] Филипп Ткачев(0/112)[досье]

Вы начните с азов.

веб-адреса, удобные для восприятия человеком

Потом поставьте себя на место рядовой секретарши, которая то и на адреса все заходит из закладок (IMHO, таких большинство). Она вообще не понимает, что такое URL, а вы ей ЧПУ подсовываете.
Почитайте Лебедева, статью про навигацию "хлебные крошки" и сразу станет все понятно. Там речь идет именно о структуризации информации на сайте.
Вы должны понимать, что действие над страницей, должно быть осознанным действием.
А если пользователь при вводе ошибется и вместо

http://127.0.0.1/main/news/sport/act=delpost&id=123546

введет

http://127.0.0.1/main/news/sport/act=delpost&id=123547

и удалит не тот пост? Или просто перепутает страницу? ЧПУ ведь подталкивает к вводу ;)

А вообще про то, что надо действие представлять действием!
Т.е. на странице

http://127.0.0.1/main/news/sport/123547/

должны быть кнопки [Добавить],[Исправить],[Удалить].
После нажатия на одну из них, в сценарий будет передано значение действия методом POST в виде

имя_действия = действие // например: act=add или act=del

Внешне ссылка ничуть не изменится, а действие будет выполнено. Это примитивная защита от неправильных действий пользователя.

Или представим другую ситуацию. Оформление заказа в несколько этапов.
Этапы должны выполняться строго один за другим и тут, во избежание соблазна, пользователь не должен видеть в строке адреса шаг, на котором он находится.
Все просто и прозрачно.

спустя 1 день 23 часа [обр] Андрей[досье]

)...
вроде мы говорим про одно и тоже... но друг друга недопонимаем
это делается для удобства и возможностей создания страниц/скриптов в дальнейшем, на данном этапе такая задача не стоит
На выбор разработчику (не секретарше) будет предложены варианты манипулирования с дейсвтиями, как и куда их тыкать и как представлять (кнопочкой, ссылкой, чем то еще), какими методами пересылать данные (POST, GET, или пользуя ajax (jquery, prototype, самописные функции..)) . Этим будет в дальнейшем заниматься тот человек, который на базе этой писанины что я пробую сделать (если получится =) ), будет писать модули под конкретные задачи.
То есть ему решать

http://127.0.0.1/main/news/sport/act=delpost&id=123547

должно ли act=delpost&id=123547 видно в броузере, передавать переменные методом GET или POST, пользуя ajax возможности... и тд...=)
Это только одна грань задуманного).
MVC модель, что то аля фреймворка для создания сайтов, самый нижний уровень.
Я хочу предоставить набор возможностей/стандартов для ускорения выполнения задач в будущем).
Вот такие планы наполеона)

спустя 2 часа 32 минуты [обр] Филипп Ткачев(0/112)[досье]
http://localhost/main/news/sport/act=delpost&id=123547&/-boot/=kl;?i=0&b=2
спустя 10 минут [обр] Андрей[досье]
  1. данная строка не пройдет, .htaccess вызовет ошибку
  2. я надеюсь умов породить подобный запрос не много)
спустя 15 часов [обр] Филипп Ткачев(0/112)[досье]
  1. Хорошо
  2. Ум не нужен. Есть боты.
спустя 5 дней [обр] Андрей[досье]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ dispetcher.php?q=$1 [L,QSA]
вроде дошло, вы правы так лучше и удобней
спустя 2 минуты [обр] Андрей[досье]
Админам
Полезность данного сообщения:
Ошибка запроса, если используется Opera 8.01 - обновите свой браузер.
у меня
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
Powered by POEM™ Engine Copyright © 2002-2005