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 уже после внутреннего редиректа, или только костылями типа этого?

Date: 2009-04-02 06:49 am (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
>5.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
Есыр, я сейчас тоже за 1600x1200 монитором, но у меня шрифт не такой мелкий!

( это намёк про то, что надо или автопереносить, или под кат такие длинные строчки )

Date: 2009-04-02 07:32 am (UTC)

Date: 2009-04-02 12:55 pm (UTC)
From: [identity profile] igorash.livejournal.com
Пост стал лучше, но лузеров с узкой лентой или невозможностью схлопнуть любой пост (привет, гризманки) всё равно разрывает... от недовольства.

Date: 2009-04-02 01:12 pm (UTC)
From: [identity profile] esyr.livejournal.com
Ёбане кривые жжшные стили, я же прописал overflow-x:auto.

Да, а менять DooM можно не только в гризманки. Я это обычно фарьбагом делаю.

Прописал fixed width.

Date: 2009-04-02 02:55 pm (UTC)
From: [identity profile] igorash.livejournal.com
А шо, таки он умеет это делать аутоматом?
Вот у меня к каждому посту в гризманки при загрузке страницы приделывается кнопочка "hide". Как добиться такого эффекта от файрбага я не знаю.

Date: 2009-04-02 05:10 pm (UTC)
From: [identity profile] esyr.livejournal.com
Нет, в виду того, что мне это надо до ужаса редко, я делаю это своими грязными руками. Ну и скриптов на все случаи не напасёшься, а если и надо, можно на месте написать опять же.

Date: 2009-04-02 04:50 pm (UTC)
From: [identity profile] http://users.livejournal.com/_winnie/
А так наоборот, слишком узенько =)
Имхо, самое простое и безопасное для всех - это просто поставить моноширинный шрифт.

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 04:43 pm
Powered by Dreamwidth Studios