MySQL + htaccess mod_rewrite?

Използвам подобен на прокси кратък домейн във връзка с моя сайт. Краткият домейн е hrci.me, а дългият домейн е reachchallenges.infectionist.com. hrci.me използва mod_rewrite и има правило, което в голяма степен прави просто пренасочване от hrci.me към reachchallenges.infectionist.com, така че например:

hrci.me/x/y.php

ще пренасочи към

reachchallenges.infectionist.com/x/y.php

Лесно, колкото може да бъде. В основния сайт имам повече правила, които допълнително пренаписват URL адреса, като го разкрасяват. Един пример е скрипт на моя сайт, challenges.php, който приема един параметър, chid, който е ID на предизвикателството, свързан с повече информация в базата данни. Предаден като параметризиран скрипт, той ще изглежда така: /challenge.php?chid=123, но след като бъде пренаписан, изглежда така: /challenge/123/Challenge+Title/, където Challenge+Title е действителното заглавие на елемента от базата данни. Има и различен начин, по който можете да извикате същата страница, като този: /ch123, така че по същество можете да получите достъп до страницата по 3 различни начина:

1. /challenge.php?chid=123
2. /challenge/123/Challenge+Title/
3. /ch123

Това всъщност работи перфектно, проблемът, който имам е, че искам URL адресите, които са пренасочени от hrci.me, първо да бъдат пренаписани, за да изглеждат като #2 по-горе, така че потребителят да щракне върху hrci.me/ch123 и файлът htaccess да прочете базата данни, вземете заглавието за предизвикателство id 123, пренапишете url на /challenge/123/Challenge+Title/ и след това го пренасочете към reachchallenges.infectionist.com. Възможно ли е нещо подобно? Възможно ли е да се чете от MySQL база данни с помощта на htaccess по този начин?

АКТУАЛИЗАЦИЯ: Добавих това към моя httpd.conf файл:

DBDriver mysql
DBDParams "host=*****,user=*****,pass=*****,dbname=*****"
RewriteMap hrci "dbd:SELECT title FROM challenges WHERE id = %s"
RewriteLog "/home/halo2freeek/rewrite.log"
RewriteLogLevel 3

След това добавих RewriteRule към един от моите поддомейни, който всъщност не използвам (за да го тествам):

RewriteEngine On
RewriteRule ^ch([0-9]{1,4})(/)?$ http://reachchallenges.infectionist.com/challenge/$1/${hrci:$1} [R=301,L]

Когато посетя този път в поддомейна:

/ch232

Трябва да пренасочи към:

http://reachchallenges.infectionist.com/challenge/232/Challenge+Title

Но вместо това пренасочва към:

http://reachchallenges.infectionist.com/challenge/232/

Без заглавието. Правя ли нещо нередно? Трябва ли да посоча RewriteEngine On във файла httpd.conf?

АКТУАЛИЗАЦИЯ 2: Добре, така че добавих реда RewriteEngine On и запазих, когато се опитах да рестартирам Apache, получих тази грешка:

RewriteMap: file for map hrci not found:/dh/apache2/apache2-ps54462/dbd:SELECT title FROM challenges WHERE id = %s

Изглежда, че напълно игнорира частта dbd и се опитва да прочете всичко като име на файл. Сега наистина не знам какво правя погрешно.


person HaLo2FrEeEk    schedule 06.09.2011    source източник


Отговори (1)


С RewriteMap всичко е възможно:

RewriteMap examplemap prg:/path/to/file.php
RewriteRule (.*) ${examplemap:$1}

Можете да използвате и mod_dbd:

DBDriver mysql
DBDParams "host=localhost,user=db_user,pass=password,dbname=db"
RewriteMap myquery "dbd:select new_url from rewrite where old_url = %s" 
RewriteRule (.*) ${myquery:$1}
person sanmai    schedule 06.09.2011
comment
Просто сте забравили да споменете, че директивата RewriteMap НЕ МОЖЕ да бъде поставена в .htaccess -- само в контекста на конфигурацията на сървъра/виртуалния хост. Ако OP не може да редактира тези файлове (на споделен хостинг, например), тогава това е безполезно за него. - person LazyOne; 06.09.2011
comment
Не, не съм. Оставям питащия сам да го открие. Освен това ще трябва да рестартирате Apache всеки път, когато промените този скрипт. Но все пак, ако човек го иска, може да го получи. - person sanmai; 06.09.2011
comment
Но все пак, ако някой го иска, той може да го получи -- Вярно. Все пак бих го споменал (лични предпочитания). - person LazyOne; 06.09.2011
comment
Имам виртуален частен сървър чрез Dreamhost, така че мога да редактирам файла httpd.conf, но не знам къде да поставя директивата RewriteMap. Освен това, в примера на sanmai, как file.php ще получи параметъра chid? Редактиране: Потърсих RewriteMap в документите на Apache и видях това: http://httpd.apache.org/docs/2.3/rewrite/rewritemap.html#dbd, което изглежда, че позволява SQL заявки, мога ли да използвам това вместо php скрипт? Нещо като SELECT title FROM предизвиква WHERE id = %s, ще работи ли това с MySQL база данни? - person HaLo2FrEeEk; 07.09.2011
comment
Да, така е. Изглежда лесен за конфигуриране и много по-лесен за използване от RewriteMap prg - person sanmai; 07.09.2011
comment
Добре, продължих и изпробвах метода dbd, актуализирах основната си публикация с повече информация. - person HaLo2FrEeEk; 07.09.2011
comment
Моля, публикувайте друг въпрос. - person sanmai; 07.09.2011
comment
Готово: stackoverflow.com/questions/7329212/ - person HaLo2FrEeEk; 07.09.2011