Хорошо, это выглядит так, как будто оно должно работать, но это не так. Я провел много испытаний с этим, и похоже, что проблема в ^([^.]+)$
в RewriteRule. Я сделал это в Google, и кажется, что это достаточно распространенная модель, поэтому я не понимаю, в чем проблема. Я просто знаю, что когда я использую этот шаблон в RewriteRule, правило не выполняется. Если я изменю его на ^([^.]+)
, то, похоже, будет работать.
Надеюсь, кто-то с большим опытом работы с mod_rewrite может прийти и объяснить us , в чем может быть проблема с этим шаблоном.
Редактировать: Я только что понял проблему с ^([^.]+)$
:
Поскольку вы создаете кеш, то «обычный» файл будет существовать на своем обычном месте. Это означает, что если вы спросите у сервера /file
, то, в зависимости от вашей конфигурации, он скажет: «Эй, file
не существует, поэтому давайте попробуем расширение по умолчанию .html
!» и так он уходит и находит file.html
. Теперь, когда вы попадете в RewriteRule, регулярное выражение ^([^.]+)$
будет сопоставлено с file.html
NOT file
.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10, ^([^.]+)$
говорит 'начало строки, за которым следует столько непериодических символов, сколько вы можете захватить, а затем конец строки', что отлично работает против file
, потому что оно не содержит точек. Он не работает против file.html
, потому что ^[^.]+
будет совпадать с file
, но когда регулярное выражение ожидает найти конец строки (то есть $
), он вместо этого находит .html
и завершается неудачей.
Причина, по которой работает ^(.*)$
, заключается в том, что гарантируется, что только .*
будет всей строкой, поскольку .*
соответствует «какому-либо из любого символа», поэтому между * не может существовать символ, который может существовать 1037 * и $
частей регулярного выражения. Это не относится к [^.]+
.
Чтобы извлечь поддомен, вам нужно будет сослаться на RewriteCond. По сути, если вы перехватываете ссылку (то есть инкапсулируете что-то внутри паренов) в RewriteCond, эти ссылки доступны для RewriteRule, который следует сразу за ним.
Например, если я написал это:
RewriteCond %{HTTP_HOST} ^([^.]+)\.example.com
Тогда в скобках будет указан поддомен - обратите внимание на ()
вокруг [^.]+
Если бы тогда я написал RewriteRule на следующей строке, захваченный выше текст стал бы доступен как %1
.
Итак, ваш RewriteRule будет выглядеть так:
RewriteRule ^([^.]+) cache/%1/$1${uri_escape:%{QUERY_STRING}}.html [L]
Надеюсь, это поможет.