Я пытаюсь создать файл 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, чтобы поймать это условие?
Имейте это так:
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]
Обязательно используйте новый браузер для тестирования.
Я считаю, что вам нужно изменить свое последнее правило на это:
# Force trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .*[^/]$ $0/ [L,R=301]
Хотя документация, похоже, говорит, что RewriteCond %{REQUEST_FILENAME}.php -f
может работать. Тестирование доказывает, что это не так. И если запрос не является ни существующим файлом или каталогом, вероятно, вам не помешает добавить эту косую черту.