LINUX.ORG.RU
решено ФорумAdmin

Задачка

 , , , ,


0

2

Привет ЛОР!

Сейчас ломаю голову как преобразовать строку:

Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/

В

RewriteCond %{QUERY_STRING} ^category=5&item=117$
RewriteRule ^cat/$ /rus/vakansy.asp? [R=301,L] 

Надо это все, потому как такой ридекрет не работает:

Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/

В итоге нагулил такое решение, если как-то можно проще то хорошо. Но в любом случае задачка интересная.


Причем точно помню, что где-то видел статью с похожей задачей. Буду признателен за ссылку на такую статейку, а то сейчас не нагуглил.

Woklex ()

Но в любом случае задачка интересная.

да? да в ней из всех строк совпадают только «category=», «item=», «cat» и «301». эта замена решается поиском строки и заменой её целиком на новые две, что в этом интересного? напиши корректный результирующий пример, если хочешь получить нормальный ответ.

anonymous ()
Ответ на: комментарий от emissar

А, хотя, вроде получилось:

$ cat .htaccess 
Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/
Redirect 301 /cat/?category=4&item=29 /products/krano4443ye-vesy/555/
Redirect 301 /cat/?category=324&item=139 /pr/krano4443ye-vesy/5533/

$ cat .htaccess | sed 's/Redirect 301 \/\(.*\)[\?]\(.*\) \(.*\)/RewriteCond %{QUERY_STRING} ^\2$\nRewriteRule ^\1$ \3 [R=301,L]/'
RewriteCond %{QUERY_STRING} ^category=4&item=15$
RewriteRule ^cat/$ /products/kranovye-vesy/362/ [R=301,L]
RewriteCond %{QUERY_STRING} ^category=4&item=29$
RewriteRule ^cat/$ /products/krano4443ye-vesy/555/ [R=301,L]
RewriteCond %{QUERY_STRING} ^category=324&item=139$
RewriteRule ^cat/$ /pr/krano4443ye-vesy/5533/ [R=301,L]

emissar ★★ ()
Ответ на: комментарий от anonymous

У меня дан файл со строками вида:

Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/
Redirect 301 /cat/?category=5&item=117 /products/laboratornye-vesy/
Redirect 301 /?type=price /products/
Redirect 301 /cat/?category=1&item=115 /products/avtomobilnye-vesy/
Redirect 301 /contacts/1/ /company/contacts/

Уже почти закончил, но мне кажется это не так и просто.

Woklex ()
Ответ на: комментарий от emissar

Круто, работает, спасибо. Мой велосипед был ужасен.

Woklex ()

#!/bin/bash

cat .htaccess | awk '{ split($0, A," ") split(A[3],B,"?") sub(«/»,"",B[1]) print «RewriteCond %{QUERY_STRING} ^» B[2] «$» print «RewriteRule ^» B[1] «$ » A[4] " [R=" A[2] ",L]" }'

anonymous ()
Ответ на: комментарий от anonymous
#!/bin/bash

cat .htaccess |
awk '{
  split($0,  A," ")
  split(A[3],B,"?")
  sub("/","",B[1])
  print "RewriteCond %{QUERY_STRING} ^" B[2] "$"
  print "RewriteRule ^" B[1] "$ " A[4] " [R=" A[2] ",L]"
}'
anonymous ()
Ответ на: комментарий от Woklex

Только такого вида строка

Redirect 301 /?type=price /products/

не правильно обработается.

emissar ★★ ()
Ответ на: комментарий от emissar

Я наверно под конец рабочего дня туплю, но сейчас проверил на этой строке, все работает.

echo Redirect 301 /?type=price /products/ |  sed 's/Redirect 301 \/\(.*\)[\?]\(.*\) \(.*\)/RewriteCond %{QUERY_STRING} ^\2$\nRewriteRule ^\1$ \3 [R=301,L]/'
RewriteCond %{QUERY_STRING} ^type=price$
RewriteRule ^$ /products/ [R=301,L]
Woklex ()
Ответ на: комментарий от anonymous

Я не указал в услоии, но могут быть строки вида:

Redirect 301 /contacts/1/ /company/contacts/

У emissar такая строка обрабатывается корректно.

Но спасибо за пример, пошел читать ман по awk.

Woklex ()
Ответ на: комментарий от Woklex

вот мой вариант


$ echo -e "Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/\nRedirect 301 /contacts/1/ /company/contacts/"|\
sed -r 's/^Redirect\s+([0-9]+)\s+\/(\S+\/)(\?(\S+))?\s+(\S+).*/RewriteCond %{QUERY_STRING} ^\3\nRewriteRule ^\2 \/rus\/vakansy.asp? [R=\1,L]/'

RewriteCond %{QUERY_STRING} ^?category=4&item=15
RewriteRule ^cat/ /rus/vakansy.asp? [R=301,L]
RewriteCond %{QUERY_STRING} ^
RewriteRule ^contacts/1/ /rus/vakansy.asp? [R=301,L]

http://emulek.ignorelist.com/sed/

emulek ()
Ответ на: комментарий от Woklex

проще было-бы если ты научился нормально формулировать задачу

Вот ещё вариант:

$ echo 'Redirect 301 /cat/?category=4&item=15 /products/kranovye-vesy/362/
Redirect 301 /cat/?category=5&item=117 /products/laboratornye-vesy/
Redirect 301 /?type=price /products/
Redirect 301 /cat/?category=1&item=115 /products/avtomobilnye-vesy/
Redirect 301 /contacts/1/ /company/contacts/'|sed -r 's/^Redirect\s+([0-9]+)\s+\/(\S+\/)(\?(\S+))?\s+(\S+).*/RewriteCond %{QUERY_STRING} ^\3\nRewriteRule ^\2 \5 [R=\1,L]/'
RewriteCond %{QUERY_STRING} ^?category=4&item=15
RewriteRule ^cat/ /products/kranovye-vesy/362/ [R=301,L]
RewriteCond %{QUERY_STRING} ^?category=5&item=117
RewriteRule ^cat/ /products/laboratornye-vesy/ [R=301,L]
Redirect 301 /?type=price /products/
RewriteCond %{QUERY_STRING} ^?category=1&item=115
RewriteRule ^cat/ /products/avtomobilnye-vesy/ [R=301,L]
RewriteCond %{QUERY_STRING} ^
RewriteRule ^contacts/1/ /company/contacts/ [R=301,L]

emulek ()
Ответ на: комментарий от Woklex

в следующий раз дай побольше данных, и сразу. А то ты дал одну строку, и ту — не по теме.

emulek ()
Ответ на: комментарий от Woklex

но сейчас проверил на этой строке, все работает.
RewriteRule ^$

Мне кажется, это правило обрабатываться апачем не будет. Должно по идеи быть ^/$

emissar ★★ ()
Последнее исправление: emissar (всего исправлений: 1)
Ответ на: комментарий от emissar

RewriteRule ^$

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

матчится с пустой строкой.

emulek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.