У меня возникли проблемы с этой переписыванием. Я никогда раньше не использовал mod_rewrite и не имею большого опыта работы с регулярными выражениями. Любая помощь будет оценена по достоинству!
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
#prevent nested looping
RewriteCond %{ENV:REDIRECT_STATUS} ^$
#re-route incoming requests
RewriteRule ^(.*)$ %{REQUEST_URI}2009/$1 [L,NE]
</IfModule>
Это частично работает,http://www.site.com/dir/направляется кhttp://www.site.com/dir/2009/но запрос типаhttp://www.site.com/dir/css/theme.cssне получается. Я надеюсь переписать все запросы к родительскому каталогу в подкаталог 2009, но я продолжаю сталкиваться с бесконечными циклами и сообщениями об ошибках сервера. Я не нашел никаких полезных примеров. Я подумал, что это будет обычная переписывание...
Заранее спасибо!
решение1
В вашем примере есть несколько проблем с правилом перезаписи. Во-первых, оно на самом деле не делает то, что вы хотите — вам не нужен %{REQUEST_URI}
бит. С исходным путем, таким как /dir/css/theme.css
REQUEST_URI, будет содержать /dir/css/theme.css
и $1 будет содержать css/theme.css
(сопоставлено с (.*)
), в результате чего конечный URL будет /dir/css/theme.css2009/css/theme.css
. Поэтому нам нужно избавиться от %{REQUEST_URI}
части, которая оставляет нас со следующим RewriteRule
^(.*)$ 2009/$1 [L,NE]
который будет переведен /dir/css/theme.css
в /dir/2009/css/theme.css
.
Однако с этим правилом все еще есть одна проблема, поскольку оно приведет к бесконечной вложенности, поскольку (.*) будет соответствовать любому URL. Итак, на первом этапе наш пример URL переписывается в /dir/2009/css/theme.css
. И поскольку новый URL /dir/2009/css/theme.css
тоже соответствует нашему правилу, он будет перезаписан снова, а затем снова и снова...
Итак, по сути, нам нужно что-то, что предотвратит перезапись URL, которые уже были перезаписаны. Так что если URL уже содержит, /dir/2009
мы хотим, чтобы Apache оставил его в покое. Один из способов сделать это — добавить следующее условие в правило перезаписи
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
с финальным файлом .htaccess, как этот
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteBase /dir
RewriteCond %{REQUEST_URI} ^(?!/dir/2009).*$
#re-route incoming requests
RewriteRule ^(.*)$ 2009/$1 [L,NE]
</IfModule>
Другой способ сделать это — создать файл .htacess в каталоге dir/2009, который не позволит Apache использовать файл из родительского каталога с помощью чего-то вроде RewriteEngine off
. Или, возможно, RewriteEngine on
без каких-либо правил тоже должно сработать.