Mod_rewrite: странное поведение с двумя правилами перезаписи

1

У меня настроены следующие правила:

 <IfModule mod_rewrite.c>
                Options -MultiViews
                RewriteEngine On

                RewriteCond %{REQUEST_URI} !^/foo/bar.php
                RewriteCond %{HTTPS} !=on
                RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

                RewriteCond %{HTTP_HOST} ^(domain.com|www.domain.com)
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ web/app.php [QSA,L]
            </IfModule>

Я хочу, чтобы все запросы с использованием HTTP были перенаправлены на HTTPS, за исключением определенного пути: /foo/bar.php.

Второе правило перенаправляет все на скрипт web/app.php(Symfony2).

Теперь все работает, за исключением того, что когда я запрашиваю http://domain.com/foo/bar.php, я перенаправляюсь на https://domain/com/web/app.php.

Если я запрашиваю https://domain/com/foo/bar.php, он работает нормально.

Это не имеет для меня никакого смысла, почему я должен быть перенаправлен на " https://domain/com/web/app.php "? Я что-то упускаю?

Благодаря !

Теги:
.htaccess
mod-rewrite

1 ответ

1
Лучший ответ

Используйте переменную THE_REQUEST вместо REQUEST_URI в первом правиле. THE_REQUEST представляет собой исходный запрос, полученный Apache из вашего браузера, и он не перезаписывается после выполнения некоторых правил перезаписи.

Options -MultiViews
RewriteEngine On

RewriteCond %{THE_REQUEST} !/foo/bar.php
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ web/app.php [QSA,L]
  • 1
    Блин, работает отлично, спасибо большое! (И спасибо за чистоту второго правила!)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню