За последние 24 часа нас посетили 20512 программистов и 1098 роботов. Сейчас ищут 756 программистов ...

Как получить один редирект вместо двух?

Тема в разделе "Настройка веб-сервера", создана пользователем Razorfen, 4 сен 2019.

Метки:
  1. Razorfen

    Razorfen Активный пользователь

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Дано правило для редиректа со страниц без слэша на страницы со слэшем:
    Код (Text):
    1. RewriteCond%{REQUEST_FILENAME}!-f
    2. RewriteCond%{REQUEST_URI}!(.*)/$
    3. RewriteCond%{REQUEST_URI}!.html$
    4. RewriteRule^(.*[^/])$ https://%{SERVER_NAME}/$1/[L,R=301]
    И правило для редиректа на https:
    Код (Text):
    1. RewriteCond%{SERVER_PORT}!^443$
    2. RewriteRule.* https://%{SERVER_NAME}%{REQUEST_URI}[L,R=301]
    Сейчас при запросе URL http://site.com/info происходит два 301 редиректа:
    Код (Text):
    1.  
    2. URL запроса:http://site.com/info
    3. Кодсостояния:301
    4.  
    5. URL запроса:https://site.com/info
    6. Кодсостояния:301
    Как объединить эти два правила, чтобы редирект происходил один раз?
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Нужно дублировать правила с незначительными изменениями. См. пример с www в конце этой статьи.

    Если делать по уму, то лучше распределять обработку таких запросов между разными хостами, т.е. «сайтами».
    --- Добавлено ---
    Еще иногда получается использовать множественные условия с [OR].
    --- Добавлено ---
    Я про подобные условия:
    Код (Text):
    1. RewriteCond%{REQUEST_URI}!(.*)/$
    Код (Text):
    1. RewriteCond%{SERVER_PORT}!^443$
     
    Razorfen нравится это.
  3. Razorfen

    Razorfen Активный пользователь

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    У меня получилось достичь желаемого результата изменив только правило для редиректа на https. Добавил: RewriteCond %{REQUEST_URI} (.*)/$
    Код (Text):
    1. RewriteCond%{SERVER_PORT}!^443$
    2. RewriteCond %{REQUEST_URI} (.*)/$
    3. RewriteRule.* https://%{SERVER_NAME}%{REQUEST_URI}[L,R=301]
    Теперь редирект один. Я правильно тебя понял?
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Нет.
     
    Razorfen нравится это.
  5. Razorfen

    Razorfen Активный пользователь

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Хорошо!
    Я попробовал с OR:
    Код (Text):
    1.  
    2. RewriteCond %{SERVER_PORT} !^443$ [OR]
    3. RewriteCond %{REQUEST_FILENAME} !-f
    4. RewriteCond %{REQUEST_URI} !(.*)/$
    5. RewriteCond %{REQUEST_URI} !.html$
    6. RewriteRule ^(.*[^/])$ https://%{SERVER_NAME}/$1/ [L,R=301]
    Но это не работает, так как это на самом деле: if ( (SERVER_PORT != 443 OR REQUEST_FILENAME != -f) and REQUEST_URI != (.*) and REQUEST_URI != .html)
    Я не нашел инфы по поводу задания приоритета в условии (по типу операторных (круглых) скобок в математике или языках программирования).
    Помоги, пожалуйста, я всю голову сломал. Мой предыдущий вариант вообще не имеет права на жизнь, хоть и работает?
    На stackoverflow мне вообще говорят, что задача нерешаема.
     
    #5 Razorfen, 4 сен 2019
    Последнее редактирование: 4 сен 2019