Назад | Перейти на главную страницу

mod_rewrite новичок

У меня следующая структура каталогов:

site
lib
versions
  /1.0
     /application
     /library
     /public

и корень моего сайта example.com.

Я хотел бы, чтобы все запросы example.com быть перенаправленным на example.com/versions/1.0/public, сохраняя URL-адрес запроса на example.com.

Мой сервер находится на Dreamhost, и с ними я просто указываю корень моего сайта на общую папку, но хост моего текущего клиента не предлагает эту возможность. Как лучше всего этого добиться?

Кроме того, поскольку я использую ZendFramework, public папка содержит .htaccess файл со следующими правилами, с которыми я не хочу конфликтовать.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Поскольку у вас есть .htaccess файл в том месте, куда вы переписываете, который использует mod_rewrite, тогда вы можете просто переписать все безоговорочно в корне .htaccess файл:

RewriteEngine On
RewriteRule (.*) /versions/1.0/public/$1 [L]

После перезаписи .htaccess файл в подкаталоге берет на себя. Никаких дополнительных условия необходимы. Нет цикла перезаписи.

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

Добавление этого в корневой каталог должно иметь желаемый эффект, хотя может быть более изящный способ сделать это:

RewriteCond %{REQUEST_URI} !^/public [NC]
RewriteCond %{REQUEST_URI} !^/library [NC]
RewriteCond %{REQUEST_URI} !^/application [NC]
RewriteCond %{REQUEST_URI} !^/site [NC]
RewriteCond %{REQUEST_URI} !^/lib [NC]
RewriteRule ^(.*)$ /versions/1.0/public/$1