esyr: (Default)
[personal profile] esyr
Жил я одно время с MediaWiki без mod_rewrite, и ссылки у меня в её нутре были вида /wiki/index.php?title=.... Со временем меня таки допинали поправить это дело (ибо не human-writable, ейб-гу). Но чтобы старые ссылки не перестали работать, пришлось таки напрячь свой ганглий (ни один из стандартных советов как-то не подошёл). Ладно, сделал:

RewriteEngine On

RewriteRule ^wiki/[iI]ndex.php/(.*)$ /wiki/$1 [R,L]
RewriteRule ^wiki/index.php /w/index.php?$1 [R,L]
RewriteRule ^wiki/images/(.*)$ /w/images/$1 [PT,L]
RewriteRule ^wiki/?$ /w/index.php [PT,L,QSA]

RewriteRule ^wiki/(.*)$ w/index.php?title=$1 [PT,L,QSA]


При этом вики лежит в /w/ и у MediaWiki в LocalConfig.php прописано, что ссылки надо генерить на /wiki/. И действительно, оно таки заработало. Но «есть один ньюанс»: всякие ссылки не на статьи (например, на страницы редактирования и прочие) всё равно выглядели как /w/index.php?title=.... Казалось бы, чего проще: при натыкании на такой URL редиректить его на /wiki/ и задача свелась бы к предыдушей. Но не тут-то было. После того, как RewriteRule со флагом L (last) отработал, всё равно происходит внутренний редирект и, кто бы мог подумать, заново начинают применяться RewriteRule. Что, естественно, порождает бесконечный цикл (/w/index.php?title=.../wiki/...). Долго я смотрел на Apache Documentation аки баран на новые ворота и пытался увидить, как же отличить свежепришедший url от уже прошедшего обработку (хотя, что характерно, в логах оно явственно видно:

...
85.140.160.226 - - [31/Mar/2009:01:57:30 +0000] [esyr.org/sid#820e978][rid#84b8958/initial] (1) [perdir /var/www/esyr/] internal redirect with /w/index.php [INTERNAL REDIRECT]
85.140.160.226 - - [31/Mar/2009:01:57:30 +0000] [esyr.org/sid#820e978][rid#84ada28/initial/redir#1] (3) [perdir /var/www/esyr/] strip per-dir prefix: /var/www/esyr/w/index.php -> w/index.php
...

). В результате не придумал ничего более умного, чем парсить THE_REQUEST, который PT таки не манглит:

<Все вышеупомянутые правила>

RewriteCond %{REQUEST_METHOD} "^GET$" [NC]
RewriteCond %{THE_REQUEST} "^(GET|POST|HEAD) +/w/index.php\?title="
RewriteCond %{QUERY_STRING} ^title=([^&]*)$
RewriteRule ^w/index.php /wiki/%1? [NE,R,L]

RewriteCond %{REQUEST_METHOD} "^GET$" [NC]
RewriteCond %{THE_REQUEST} "^(GET|POST|HEAD) +/w/index.php\?title="
RewriteCond %{QUERY_STRING} ^title=([^&]*)&(.*)$
RewriteRule ^w/index.php /wiki/%1?%2 [NE,R,L]

RewriteCond %{THE_REQUEST} "^(GET|POST|HEAD) +/w/images/"
RewriteRule ^w/images/(.*)$ /wiki/images/$1 [R,L]


Первые два rewrite rule манглят просто имена и сложно (с параметрами) имена. Возможно, второе правило (при дополнительном допиливании) вполне себе покроет первое, но при отладке оно выродилось в это. Последнее правило обрабатывает URL изображений (ибо ваистену).

Собственно вопрос: есть ли нормальный способ отловить, что URL уже после внутреннего редиректа, или только костылями типа этого?
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

esyr: (Default)
esyr

October 2010

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 6th, 2026 08:28 pm
Powered by Dreamwidth Studios