Ошибка htaccess 404 во вложенной папке языка (en /)

У меня такая структура:

/  
/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]  

Заранее благодарю за любую помощь!

Я не вижу подпапки lang в вашей структуре каталогов .. В чем именно ваша проблема ... На мой взгляд .. Если вы пытаетесь удалить расширение .php так, как вы здесь указали, это приведет к сбою когда вы пытаетесь просмотреть подкаталог, потому что это Ищу для маскировки example.com/lang -> example.com/lang.php. Так что на самом деле он только говорит вам, что lang.php не существует.

Zak 30.05.2018 18:04

Именно в этом и проблема. Подкаталоги терпят неудачу из-за такого подхода. Я пробовал несколько других версий, но я не знаком с htaccess, и у меня всегда не работает сайт

Luigital 30.05.2018 18:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы действительно близки к тому, что у вас есть. Теперь, когда я знаю проблему, я дам вам то, что использую - вам нужно условие, которое говорит это не каталог - и синтаксис !-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?

Luigital 30.05.2018 19:19

вы можете просто закомментировать RewriteCond %{HTTPS} off [OR] - А потом поменять RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L] на RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

Zak 30.05.2018 19:29

Я пробовал это раньше, но думаю, что файл htaccess был кэширован, поэтому он не работал. Я снова протестировал его в чистом браузере, и он отлично работает. Еще раз спасибо!

Luigital 30.05.2018 20:00

Привет еще раз. Я попробовал этот htaccess на новом веб-сайте, и у меня возникла следующая проблема: когда я указываю подкаталог en, я получаю следующее сообщение в браузере The requested URL /en.php was not found on this server.. Есть идеи?

Luigital 30.01.2019 15:44

Другие вопросы по теме