У меня такая структура:
/
/about.php
/contact.php
/en/
/en/about.php
/en/contact.php
И я хочу удалить расширение .php и префикс www из URL-адресов, а также принудительно использовать https.
Теперь у меня есть следующий htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
Заранее благодарю за любую помощь!
Именно в этом и проблема. Подкаталоги терпят неудачу из-за такого подхода. Я пробовал несколько других версий, но я не знаком с htaccess, и у меня всегда не работает сайт






Вы действительно близки к тому, что у вас есть. Теперь, когда я знаю проблему, я дам вам то, что использую - вам нужно условие, которое говорит это не каталог - и синтаксис !-d
Вот так выглядит мой htaccess (потому что я использую его для удаления html, а также php:
RewriteEngine on
# Redirect www and http to https - non-www
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# Start php extension remove
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
# End php extension remove
# Start html extension remove
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# End html extension remove
Как видите, первый условие проверяет, что это не каталог. Следующий условие проверяет, является ли расширение файла .php. Если оба условия равны правда - правило должен удалить расширение.
В качестве примечания - я бы сделал ваш синтаксис немного чище и разделил «разделы» того, что вы пытаетесь сделать.
ОБНОВЛЕНИЕ КАК КОММЕНТАРИЙ
Чтобы удалить форсирование https - просто закомментируйте первый условие и измените https на http в правило:
RewriteEngine on
# Redirect www and http to https - non-www
#RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
# Start php extension remove
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
# End php extension remove
# Start html extension remove
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# End html extension remove
Спасибо Заку за быстрый ответ. Он отлично работает и выглядит намного чище. Просто вопрос. Что мне нужно отредактировать, чтобы убрать силу https?
вы можете просто закомментировать RewriteCond %{HTTPS} off [OR] - А потом поменять RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L] на RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
Я пробовал это раньше, но думаю, что файл htaccess был кэширован, поэтому он не работал. Я снова протестировал его в чистом браузере, и он отлично работает. Еще раз спасибо!
Привет еще раз. Я попробовал этот htaccess на новом веб-сайте, и у меня возникла следующая проблема: когда я указываю подкаталог en, я получаю следующее сообщение в браузере The requested URL /en.php was not found on this server.. Есть идеи?
Я не вижу подпапки
langв вашей структуре каталогов .. В чем именно ваша проблема ... На мой взгляд .. Если вы пытаетесь удалить расширение.phpтак, как вы здесь указали, это приведет к сбою когда вы пытаетесь просмотреть подкаталог, потому что это Ищу для маскировкиexample.com/lang->example.com/lang.php. Так что на самом деле он только говорит вам, чтоlang.phpне существует.