Применить правило перезаписи htaccess к переписанному URL - PullRequest
1 голос
/ 23 августа 2011

Можно ли применить правило перезаписи .htaccess к уже переписанному URL?

Пример: Я хочу изменить размер своих фотографий с помощью timthumb.php (самая последняя версия, поэтому больше не должно быть ошибок безопасности). Но URL должен выглядеть хорошо, поэтому я создал это правило перезаписи:

RewriteRule ^rz/(.*)x(.*)/r/(.*) /themes/Nerdtalk/timthumb.php?src=$3&h=$2&w=$1&q=80

Это правило работает нормально, но перед запуском timthumb.php, который может перенаправить к кешированному файлу, я хочу, чтобы Apache проверил, существует ли файл, и разрешил Apache перенаправить к кешированному файлу, поэтому timthumb.php победил ' не может быть начато. Поэтому я создал этот набор правил:

RewriteCond %{SCRIPT_FILENAME} timthumb.php
RewriteCond %{QUERY_STRING} src=(.*)\.(png|jpe?g)&h=([0-9]+)&w=([0-9]+)&q=([0-9]+)
RewriteCond %{DOCUMENT_ROOT}/cache/%1-%4-%3-1-%5.%2 -f
RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2 [L]
  1. Может ли уже переписанный URL быть переписан во второй раз?

  2. Правильна ли вторая часть?

  3. Если есть возможность объединить эти два набора правил, подскажите, пожалуйста, как?

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Может ли уже переписанный URL быть переписан во второй раз?

Да. Когда происходит перезапись (правило с флагом [L] или конец htaccess), mod_rewrite переходит к следующей итерации и снова начинает сопоставлять все правила с начала. Вот почему вам нужно создавать свои правила с учетом цикла перезаписи (особенно если вы используете этот тип шаблона ^(.*)$ для сопоставления).

Если вы пишете правило без флага [L], то перезапись продолжается на той же итерации, поэтому любые правила, помещенные ниже текущей, могут снова перезаписать URL на совершенно другой.

Верна ли вторая часть?

Я бы сказал Да (хотя не проверял фактический Apache). Я просто не уверен насчет первого условия перезаписи (просто никогда не использовал %{SCRIPT_FILENAME}, поэтому сам не уверен, как именно оно работает) - я бы использовал %{REQUEST_URI} timthumb\.php$ или что-то в этом роде.

Единственное, что я бы добавил, это ? при перезаписи цели, чтобы избавиться от вновь созданной (1 правило выше) строки запроса: RewriteRule ^.* /cache/%1-%4-%3-1-%5.%2? [L]. Но он должен работать нормально, как сейчас.

Если есть возможность объединить эти два набора правил, пожалуйста, скажи как?

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

Если это не сработает сразу (поскольку переменные Apache (%{SCRIPT_FILENAME}, %{QUERY_STRING} и т. Д.) Могут не иметь правильных значений сразу) попробуйте добавить флаг [L] в первое правило перезаписи - это вызовет следующую итерацию, которая заполняет эти переменные правильные значения наверняка, и, в зависимости от остальных ваших правил, которые вы можете иметь до этого, он достигнет 2-го набора правил, где произойдет 2-е переписывание.

Если вы хотите - вы можете полностью переписать его, чтобы сразу же проверить и обслужить кэшированный файл (если он есть), а затем (если все еще ничего) переписать изображение, которое будет обработано timthumb.php, но это будет выполнять точно такую ​​же работу как указано выше, немного по-другому.

0 голосов
/ 23 августа 2011

Может ли уже переписанный URL быть переписан во второй раз?

Да, это возможно.Это поведение по умолчанию, и если вы хотите изменить его, вы можете использовать флаги, такие как [L]: http://httpd.apache.org/docs/current/rewrite/flags.html

Правильно ли вторая часть?

I 'Я не уверен, что вы можете использовать% 1 и т. д. в директиве RewriteCond

Если есть возможность объединить эти два набора правил, подскажите, пожалуйста, как?

Я бы поместил кеш в ту же папку, что и исходный URL: ^ rz /(.) x (. ) / r / Если он существует - просто обслужите его, если нет - используйте php

...