URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7982
[ Назад ]

Исходное сообщение
"Сложная замена URL в nginx или htaccess ?"

Отправлено anstrem , 25-Июн-15 10:58 
Подскажите как решить задачку с подменой URL и где лучше в nginx или htaccess ?

Нужно вместо страницы
http://site.ru/page?filter=&fd13=105
переадресовать пользователя на страницу:
http://site.ru/page/subpage
Но показать ему при этом содержимое из:
http://site.ru/page?filter=&fd13=105&code=m


Если в общем случае, то это будет звучать как:
1) если URL заканчивается параметром "?filter=&fd13=105", то надо в адресной строке заменить этот параметр на "/subpage"
2) и далее следом если URL заканчивается на /subpage, то надо показать данные c URL что вызывается, но в котором заменено "/subpage" на "?filter=&fd13=105&code=m"

Ну и чтобы при этом зацикливания не произошло, хотя вроде и не должно...

Если просто напрямую вызовут URL заканчивающийся на /subpage, то естественно тоже чтобы 2-ое правило отработало.


Содержание

Сообщения в этом обсуждении
"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 15:19 
> Подскажите как решить задачку с подменой URL и где лучше в nginx
> или htaccess ?
> Нужно вместо страницы
> http://site.ru/page?filter=&fd13=105
> переадресовать пользователя на страницу:
> http://site.ru/page/subpage
> Но показать ему при этом содержимое из:
> http://site.ru/page?filter=&fd13=105&code=m

и какой в этом, мать его, сакральный смысл?

> Если в общем случае, то это будет звучать как:
> 1) если URL заканчивается параметром "?filter=&fd13=105", то надо в адресной строке заменить
> этот параметр на "/subpage"
> 2) и далее следом если URL заканчивается на /subpage, то надо показать
> данные c URL что вызывается, но в котором заменено "/subpage" на
> "?filter=&fd13=105&code=m"

сначала накидают быдлокод, а потом устраивают вечеринки с бубнами ...
1) отдавать нормальные линки не пробовали?
2) писать нормальный код не пробовали?
3) маны лицезреть не пробовали?
4) решить задачу разбивкой на две: замена №1 СРАЗУ на №3, и замена №2 на №3
5) остальное в манах реврайта мой юный падаван ...
это как я понял - что вы там подразумевали я хз ...

> Ну и чтобы при этом зацикливания не произошло, хотя вроде и не
> должно...

чтобы произошло зацикливание №1 и №3 должны быть идентичные, хотя когда мозга нет и руки из жо... то все возможно!

> Если просто напрямую вызовут URL заканчивающийся на /subpage, то естественно тоже чтобы
> 2-ое правило отработало.


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 15:27 
Сакральный смысл простой:

Пользователь на сайте выбирает опции фильтра: мальчик или девочка
В результате генериться URL с параметрами например: http://site.ru/page?filter=&fd13=105

А теперь надо чтобы вместо этой хрени на экране у него сформировался в адресной строке ЧПУ http://site.ru/page/subpage , но данные были получены с этой хрени с еще одним доп параметром, т.е. отсюда http://site.ru/page?filter=&fd13=105&code=m

Все это для того чтобы реализовать вот такой же вариант (при этом ничего не меняя в коде, а только пошаманив в htaccess, если это конечно возможно):

http://www.kinderly.ru/collection/krossovki
http://www.kinderly.ru/collection/krossovki/dlya-devochki
http://www.kinderly.ru/collection/krossovki/dlya-malchika

Предполагалась где то вот такая конструкция:

RewriteCond %{QUERY_STRING} ^filter=%26fd13%3D105$
RewriteRule ^(.*)$ $1/dlya_malchikov? [L,R=301]
RewriteRule ^/dlya_malchikov$ ?filter=%26fd13%3D105$&language_code=nl [L,NE]

Т.е. если в параметрах видим "filter=%26fd13%3D105", то делаем редирект на /dlya_malchikov, а потом если видим в адресе /dlya_malchikov, то показываем данные из ?filter=%26fd13%3D105$&code=nl

Первая часть с редиректом отрабатывает, а вот со второй проблема, на 404 ошибку кидает все время, хотя если ручками вбить такой URL (?filter=%26fd13%3D105$&code=nl), то он открывается ...


"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 16:03 
> Сакральный смысл простой:
> Пользователь на сайте выбирает опции фильтра: мальчик или девочка
> В результате генериться URL с параметрами например: http://site.ru/page?filter=&fd13=105
> А теперь надо чтобы вместо этой хрени на экране у него сформировался
> в адресной строке ЧПУ http://site.ru/page/subpage , но данные были получены с
> этой хрени с еще одним доп параметром, т.е. отсюда http://site.ru/page?filter=&fd13=105&code=m

вы пытаетесь синтезировать некий алгоритм, смысла я так и не понял - понял что надо заменить через жопу урлы, но _ЗАЧЕМ_ так и не понял.

> Все это для того чтобы реализовать вот такой же вариант (при этом
> ничего не меняя в коде, а только пошаманив в htaccess, если
> это конечно возможно):

т.е. научить код реагировать "правильно" на "корявые" ссылки при этом не меняя кода? оригинально!

> http://www.kinderly.ru/collection/krossovki
> http://www.kinderly.ru/collection/krossovki/dlya-devochki
> http://www.kinderly.ru/collection/krossovki/dlya-malchika
> Предполагалась где то вот такая конструкция:
> RewriteCond %{QUERY_STRING} ^filter=%26fd13%3D105$
> RewriteRule ^(.*)$ $1/dlya_malchikov? [L,R=301]
> RewriteRule ^/dlya_malchikov$ ?filter=%26fd13%3D105$&language_code=nl [L,NE]
> Т.е. если в параметрах видим "filter=%26fd13%3D105", то делаем редирект на /dlya_malchikov,
> а потом если видим в адресе /dlya_malchikov, то показываем данные из
> ?filter=%26fd13%3D105$&code=nl

а почему, блиать, сразу не переписать первое на третье??????


> Первая часть с редиректом отрабатывает, а вот со второй проблема, на 404
> ошибку кидает все время, хотя если ручками вбить такой URL (?filter=%26fd13%3D105$&code=nl),
> то он открывается ...


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 16:06 

> а почему, блиать, сразу не переписать первое на третье??????

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

А переписывать чужой говнокод не всегда возможно.

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



"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 16:21 
>> а почему, блиать, сразу не переписать первое на третье??????
> блиать, потому что в адресной строке надо чтобы было второе, а на
> экране чтобы выводилось то что находится по третьей ссылке

1) иногда лучше молчать, и казаться умнее, чем заговорить и развеять все сомнения (С) народная мудрость
2) феерично
3) то что браузер запросил, то он в адресной строке и пишет (GET)
4) для этого есть POST, сессии и т.д.

> А переписывать чужой говнокод не всегда возможно.

fix: не всегда умеют

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

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


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 16:28 

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

Я может не очень понимаю как работает htaccess, но разве такое не возможно ?

Браузер запрашивает URL1 с параметрами
Апач по соответствующей директиве в htaccess делает внешний редирект на другую адресную строку без параметров и фактически запускает новую сессию с новым URL2
Получив запрос по новому URL2 Апач по другой директиве в htaccess не меняя URL2 (внутренний редирект) выдает данные с третьего URL3

Или так оно не может работать ?


"Сложная замена URL в nginx или htaccess ?"
Отправлено Square , 25-Июн-15 16:40 
>> мои коменты были весьма таки по теме, я просто пытался понять "зачем",
>> но вы подтвердили мои самые худшие сомнения ...
> Я может не очень понимаю как работает htaccess, но разве такое не
> возможно ?
> Браузер запрашивает URL1 с параметрами
> Апач по соответствующей директиве в htaccess делает внешний редирект на другую адресную
> строку без параметров и фактически запускает новую сессию с новым URL2
> Получив запрос по новому URL2 Апач по другой директиве в htaccess не
> меняя URL2 (внутренний редирект) выдает данные с третьего URL3
> Или так оно не может работать ?

урл /dlya_malchikov - он же один только может быть да?
а урлов ?filter=%26fd13%3D105$&code=nl - дофига ?

как по вашему сервер опознает какую страницу из этих дофига он должен показать если все клиенты пришлют ему только "/dlya_malchikov"?

попробуйте поискать тут:
http://www.yandex.ru/search/?text=ЧПУ%20сайт&clid=9582&lr=213

http://blogiseo.ru/blogovedenie/kak-sdelat-chpu-dlya-sajta.html


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 16:58 
> Вы не понимаете.
> вид урла рисует БРАУЗЕР.
> Вы, правкой htaccess, НИКАК не сможете поменять то что рисует браузер.
> А браузер вам нарисует ту ссылку которая в коде странички.
> На сайте который вы привели - включен ЧПУ.

Чета я действительно уже ничего не понимаю
А что тогда описано в бесконечных FAQ в сети с заголовками: "Управляем URL с помощью .htaccess и mod_rewrite" ?

Я у себя на сайте без проблем же меняю что рисует браузер через .htaccess

Запрашиваю в адресной строке браузера
http://site.ru/kedyi-krossovki?filter=%26fd13%3D105

В результате после редиректа в браузере получаю:
http://site.ru/kedyi-krossovki/dlya_malchikov

Делается это вот этим двумя командами в htaccess:

RewriteCond %{QUERY_STRING} ^filter=%26fd13%3D105$
RewriteRule ^(.*)$ $1/dlya_malchikov? [L,R=301]

Это же обычный 301 редирект с одного URL на другой.
Ну можно его в nginx еще сделать же...


Но никакого URL http://site.ru/kedyi-krossovki/dlya_malchikov у меня естественно на сайте нет и поэтому надо дальше проброс сделать через внутренний какой то скрытый редирект что тоже в куче форумов с заголовками "Внутренний редирект без смены URL"
Все прочел, но что то не склеивается :)



"Сложная замена URL в nginx или htaccess ?"
Отправлено Square , 25-Июн-15 17:12 
>[оверквотинг удален]
> Делается это вот этим двумя командами в htaccess:
> RewriteCond %{QUERY_STRING} ^filter=%26fd13%3D105$
> RewriteRule ^(.*)$ $1/dlya_malchikov? [L,R=301]
> Это же обычный 301 редирект с одного URL на другой.
> Ну можно его в nginx еще сделать же...
> Но никакого URL http://site.ru/kedyi-krossovki/dlya_malchikov у меня естественно на
> сайте нет и поэтому надо дальше проброс сделать через внутренний какой
> то скрытый редирект что тоже в куче форумов с заголовками "Внутренний
> редирект без смены URL"
> Все прочел, но что то не склеивается :)

Описание:
Предположим что мы недавно переименовали страницу bar.html в foo.html и сейчас хотим для обратной совместимости сделать доступным и старый URL. В действительности мы хотим чтобы пользователи использующие старый URL даже не узнали что страницы были переименованы.
Решение:
Мы перенаправим старый URL на новый через внутренний редирект путем следующих директив:

RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo\.html$ bar.html

http://www.htaccess.net.ru/doc/mod_rewrite/


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 17:31 

> урл /dlya_malchikov - он же один только может быть да?
> а урлов ?filter=%26fd13%3D105$&code=nl - дофига ?
> как по вашему сервер опознает какую страницу из этих дофига он должен
> показать если все клиенты пришлют ему только "/dlya_malchikov"?

Да нет, сервер просто должен заменить в любом урл "/dlya_malchikov" на урл "?filter=%26fd13%3D105$&code=nl"

Точнее не так !!!
Урл сервер должен оставить в данном случае без изменений, то есть как было "/dlya_malchikov" так и должно остаться "/dlya_malchikov"
А вот данные сервер должен подгрузить со страницы с "?filter=%26fd13%3D105$&code=nl"

Это возможно ? Или это только в PHP, javascript, ajax и т.д. сделать можно ?

Вот если я Ваш пример правильно понял выше. Пользователь наберет старый url bar.html
и увидит по нему информацию которая на сервера на самом то деле лежит по url foo.html
Причем он даже и не узнает от том что bar.html уже нет.

Вот и мне надо чтобы пользователь набрал в адресной строке /dlya_malchikov, а увидел информацию со страницы ?filter=%26fd13%3D105$&code=nl (но в адресной строке у него осталось /dlya_malchikov)


"Сложная замена URL в nginx или htaccess ?"
Отправлено Andrey Mitrofanov , 25-Июн-15 17:40 
>> как по вашему сервер опознает какую страницу из этих дофига он должен
>> показать если все клиенты пришлют ему только "/dlya_malchikov"?
> Да нет, сервер просто должен заменить
> Точнее не так !!!
> Урл сервер должен оставить в данном случае без изменений,

Вы уверены, что уже не пора начинать спрашивать _прокси_, переписывающий и URL-и запросов, и выдаваемый в ответ HTML? Хинт: "Неиспраавленное" приложение отдаёт html-и со ссылками внутри на _непереписанные_ URL-и [своих соседних страниц~].

И, да, в общем случае эта задача не разрешима: генерация url-ей js-ами; url-и внутри... ну, скажем, флэшей. Да мало ли ни с чем не совместимой пакости (sip, rtsp?) проскакивает в этом вашем http.


"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 17:47 
> Это возможно ? Или это только в PHP, javascript, ajax и т.д.
> сделать можно ?

! Н Е В О З М О Ж Н О !


> Вот если я Ваш пример правильно понял выше. Пользователь наберет старый url
> bar.html
> и увидит по нему информацию которая на сервера на самом то деле
> лежит по url foo.html
> Причем он даже и не узнает от том что bar.html уже нет.
> Вот и мне надо чтобы пользователь набрал в адресной строке /dlya_malchikov, а
> увидел информацию со страницы ?filter=%26fd13%3D105$&code=nl (но в адресной строке у него
> осталось /dlya_malchikov)

еще раз для очень одаренных:
1) не хотите светить переменные - POST, сессии и т.д.
2) это GET метод, детка!
3) принцип http следующий: а) браузер просил урл у сервера б) уже на сервере происходить подмена урла если включен реврайт, до непостредственной обработки в) подмененный урл реврайт подсовывается веб серверу г) сервер отвечает на переписанный урл е) все конец
и тут два важных момента: первый - при каждом новом урле итерация повторится (после редиректа), и данные итерации НЕЗАВИСИМЫЕ, вот чтобы их "увязать" есть переменные в урле (GET), или не в урле (POST), и второй момент - ни браузер ни сервер не знают что урл переписан!


"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 17:49 
> ! Н Е В О З М О Ж Н О !

можно использовать
ссылу типа /dlya_malchikov/305/607/xxx/ и т.т.
т.е. закодить значиния вариэйблоф в строку - ПОДРУГОМУ НЕВОЗМОЖНО, БЛИАТЬ!


"Сложная замена URL в nginx или htaccess ?"
Отправлено anstrem , 25-Июн-15 17:59 
>> ! Н Е В О З М О Ж Н О !

А вот так будет ?


.htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]


index.php

$handle = fopen("http://www.webaliser.org".$_SERVER['REQUEST_URI'], "r");
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    echo $buffer;
}
fclose($handle);


"Сложная замена URL в nginx или htaccess ?"
Отправлено Pahanivo , 25-Июн-15 18:03 
афтар, больше не пиши сюда ....



"Сложная замена URL в nginx или htaccess ?"
Отправлено eRIC , 25-Июн-15 18:19 
в этом круговороте редиректов :) я вижу только вот такой смысл реализации:

1- если URI = /page?filter=&fd13=105
2- замени/редирект что переехал URI на /page/subpage и обратись
3- URI /page/subpage проксирует запрос на URI /temp (/temp дублирующий код, для того чтобы цикла не было)
4- URI /temp выдает код что и код URI /page?filter=&fd13=105&code=m (по сути два разных файла скрипта)