пытаясь поймать все условия для перенаправления URL в файле htaccess

1

Я пытаюсь создать файл htaccess, который перенаправит все возможные URL-адреса в правильный формат.

Я хочу, чтобы все URL-адреса были в формате:

https://www.mywebsite.co.uk/mypage

Все страницы моего сайта - filename.php

Мой текущий код htaccess выглядит следующим образом:

RewriteEngine On

RewriteBase /

# Force WWW prefix
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Force SSL
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

# Remove .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/(.+)/$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^(.*)/$ $1.php [L]

# Force trailing slash
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

Это работает практически для всех условий, но если я нажму на ссылку:

https://www.mywebsite.co.uk/mypage

Это должно автоматически перенаправляться на:

https://www.mywebsite.co.uk/mypage/

Но он не перенаправляет и не добавляет конечную косую черту.

Как я могу добавить в текущий файл htaccess, чтобы поймать это условие?

Теги:
.htaccess
redirect
mod-rewrite

2 ответа

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

Имейте это так:

Options -MultiViews
RewriteEngine On
RewriteBase /

# Force WWW prefix
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

# Force SSL
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]

# Remove .php extension
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

# Force trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/$ $1.php [L]

Обязательно используйте новый браузер для тестирования.

0

Я считаю, что вам нужно изменить свое последнее правило на это:

# Force trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .*[^/]$ $0/ [L,R=301]

Хотя документация, похоже, говорит, что RewriteCond %{REQUEST_FILENAME}.php -f может работать. Тестирование доказывает, что это не так. И если запрос не является ни существующим файлом или каталогом, вероятно, вам не помешает добавить эту косую черту.

  • 0
    Это ведет себя так же, как мой предыдущий код, и не вызывает завершающий слеш, если URL имеет тип mywebsite.co.uk/mypage
  • 0
    Я успешно проверил это. Не могли бы вы попробовать деактивировать другие правила, чтобы проверить, не застряло ли оно где-нибудь еще?

Ещё вопросы

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