mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

mod_rewrite www.site.com/dir/ --> www.site.com/dir/2009/

У меня возникли проблемы с этой переписыванием. Я никогда раньше не использовал 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.cssREQUEST_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без каких-либо правил тоже должно сработать.

Связанный контент