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]  

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

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
Другие вопросы по тегам