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

Перезапись Apache прерывается, когда подкаталог url-адреса сайта https явно указан через http

Я боролся с глупой проблемой, и я уверен, что кто-то уже спрашивал об этом, но я не мог найти правильный ответ здесь или где-либо еще. Итак, я иду. Я установил свой файл .htaccess для перенаправления всех HTTP-запросов на https. Перезапись также разрешена. Кажется, все работает нормально, однако, когда я указываю сегмент с http, сайт перенаправляется на https://example.com/index.php. Скажите, например:

example.com -> redirects correctly to https://example.com
http://example.com -> redirects correctly
example.com/subdirectory -> redirects to https://example.com/index.php
http://example.com/subdirectory -> redirects to https://example.com/index.php
https://example.com/subdirectory -> redirects correctly

Если я использовал навигационные ссылки после https://exmaple.com загружается, все хорошо.

Мои правила перезаписи и перенаправления следующие:

RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} (.+)/$    
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ %1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Что я делаю не так? Спасибо за ваше время и ценим любую помощь. Приносим извинения, если это дубликат, и будем благодарны за толчок в правильном направлении. Спасибо.

Пройдем через это:

  • Ваше первое правило, по сути, устанавливает HTTP: авторизация, что является чем-то странным, специфичным для вашей настройки, но не необычным ... что важно, нет [L]
  • Второе правило гласит, что когда вы REQUEST_URI, который заканчивается на /, но не является каталогом, вы захватываете только этот файл. Если он совпадает, вы перенаправляете извне, и мы возвращаемся к первому правилу - когда мы встречаемся с ним второй раз, мы должны его передать.
  • Третье правило говорит, что если запрос не является файлом, а запрос не является каталогом, внутренний путь должен идти к index.php, и никакие другие правила не должны соответствовать ничему другому.
  • Наконец, ваше правило, которое перехватывает все http: // и перенаправляет извне на https: //, теряя строку запроса в процессе

Я не совсем понимаю, что происходит и почему это не удается, но перемещение последнего правила на первое должно исправить это.

Вы также можете рассмотреть возможность переключения REQUEST_URI, так как вы потеряете все строки запроса после пути. Вместо этого замените последнюю строку следующим:

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

Это обеспечивает:

  • http://example.com без косой черты идет к https://example.com
  • любой персонаж (.) после / повторяется ноль или более раз (*) помещается в группу номер 1
  • $ 1 добавляется в конец URL с протоколом HTTPS

По непонятным мне причинам у меня сработало перенаправление http на https. Итак, мой файл теперь выглядит так.

RewriteEngine On
#Redirect from http to https
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
#as @LTPCGO suggested, I think I will change the above line to the one below. but i've included to show that it works for now.
#RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

Однако я заметил, что если я укажу index.php в URL-адресе, например, https://example.com/index.php/subdirectory, index.php не удаляется. Итак, я последовал за ответом @Frédéric Klee (способ сделать это в Symfony 2), найденным здесь https://stackoverflow.com/questions/9608366/remove-index-php-from-url-with-htaccess. Теперь мои правила выглядят так,

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]

# Sets the HTTP_AUTHORIZATION header removed by apache
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]

RewriteRule .? %{ENV:BASE}/index.php [L]

Спасибо @LTPCGO за ответы, очень признателен.