Я боролся с глупой проблемой, и я уверен, что кто-то уже спрашивал об этом, но я не мог найти правильный ответ здесь или где-либо еще. Итак, я иду. Я установил свой файл .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]
Что я делаю не так? Спасибо за ваше время и ценим любую помощь. Приносим извинения, если это дубликат, и будем благодарны за толчок в правильном направлении. Спасибо.
Пройдем через это:
[L]
Я не совсем понимаю, что происходит и почему это не удается, но перемещение последнего правила на первое должно исправить это.
Вы также можете рассмотреть возможность переключения REQUEST_URI, так как вы потеряете все строки запроса после пути. Вместо этого замените последнюю строку следующим:
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]
Это обеспечивает:
http://example.com
без косой черты идет к https://example.com
.
) после /
повторяется ноль или более раз (*
) помещается в группу номер 1По непонятным мне причинам у меня сработало перенаправление 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 за ответы, очень признателен.