Может ли уже переписанный 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, но это будет выполнять точно такую же работу как указано выше, немного по-другому.