За последние 24 часа нас посетили 18114 программистов и 1606 роботов. Сейчас ищут 952 программиста ...

Настройка .htaccess для backend и frontend.

Тема в разделе "PHP для новичков", создана пользователем Sergey_Tsarev, 26 май 2017.

  1. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Всем привет! Подскажите кто в htaccess хорошо разбирается. В корне сайта лежат две папки backend и frontend. В корне лежит файл .htaccess вот такой:

    PHP:
    1. <IfModule mod_rewrite.c>
    2.     Options +FollowSymlinks
    3.     RewriteEngine On
    4. </IfModule>
    5. <IfModule mod_rewrite.c>
    6.     RewriteCond %{THE_REQUEST} ([^\s]*)\/{2,}(\?[^\s]*)?
    7.     RewriteRule (.*) %1 [R=301,L]
    8.  
    9.     RewriteBase /
    10.     RewriteCond %{HTTP_HOST} (.*)
    11.     RewriteCond %{REQUEST_URI} /$ [NC]
    12.     RewriteRule ^(.*)(/)$ $1 [L,R=301]
    13.  
    14.     RewriteCond %{REQUEST_URI} ^/.*
    15.     RewriteRule ^(.*)$ frontend/$1 [L]
    16.     RewriteCond %{REQUEST_URI} !^/frontend/
    17.     RewriteCond %{REQUEST_FILENAME} !-f [OR]
    18.     RewriteCond %{REQUEST_FILENAME} !-d
    19.     RewriteRule ^.*$ frontend/index.php
    20. </IfModule>
    В backend такой:

    PHP:
    1. <IfModule mod_rewrite.c>
    2. RewriteBase /
    3. RewriteRule ^(.*)$ /404 [L,R=301]
    4. </IfModule>
    В frontend такой:

    PHP:
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine on
    3. RewriteBase /frontend/
    4. RewriteCond %{REQUEST_FILENAME} !-f
    5. RewriteCond %{REQUEST_FILENAME} !-d
    6. RewriteRule (.*) /frontend/index.php?$1 [QSA,L]
    7. </IfModule>
    Всё работает нормально. Все запросы перенаправляются на /frontend/index.php. В маршрутизаторе прописал всё вроде правильно написал, если контроллера и экшена не существут, то кидает 404 ошибку. Но если в адресной строке ввести адрес с расширением на конце (http://site.loc/blabla/file.php), то перенаправления не происходит, а тупо срабатывает контроллер по умолчанию.
    Я так понимаю это из-за вот этих строчек:

    PHP:
    1. RewriteCond %{REQUEST_FILENAME} !-f
    2. RewriteCond %{REQUEST_FILENAME} !-d
    Суть вопроса: мне нужно полностью закрыть доступ к папке backend (при любом обращении к папке, подпапкам и файлам должно перекидывать на http://404). В frontend доступ должен быть только к папкам js, css, images. В папке js - соответственно расширение только .js, в css - .css, в images - jpg, png, svg. На все остальные запросы даже к существующим файлам и директориям перекидывать на http://404.

    И ещё вопросик: можно как-то отключить GET-запросы? Если пользователь например ввёл правильный адрес, но добавил get-запрос, то его кидало на 404. В принципе можно конечно в роутере проверить массив $_GET и если он не пустой, то выдать ошибку. Но может быть это можно как-то сделать через .htaccess.

    Буду благодарен за помощь! ;)
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    PHP:
    1. if (!defined (кокой-то_код)) {
    2.   header ("Location: куданадо");
    3. }
    не поможет?
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    доступ к каталогу лучше запретить без использования рерайтера. директивы directory и location
     
  4. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    А ещё лучше вынести их из document root
     
    Fell-x27 нравится это.
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Похоже на попытку держать на одном домене Yii2 Advance App. Я прав?
     
  6. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Не совсем) Я в целях обучения делаю свой роутинг. А то с использованием фреймворков многие вещи ускользают от понимания и осознания как это работает) За основу я взял структуру и .htaccess из Yii2. Ну хотя структура везде похожа. Не только в Yii. Вот мне интересно как правильно скрыть структуру документа от посторонних глаз и выдавать пользователю только ту информацию, которая предназначена для него. То есть существуют определённые адреса, по которым пользователь может ходить, а если он введёт полный путь др файла или папки, ему бы возвращалась 404 ошибка.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я всегда стараюсь, чтоб у меня всё, что пользователю не нужно, висело выше Document Root, о чём здесь писали уже. Сейчас даже многие шаред-хостинги это позволяют делать. Тогда все эти пересложнённые htaccess-ы нафиг не нужны, сервер просто никого не пустит выше document root. В публичных папках, куда складываются загруженные пользователем файлы, должно быть запрещено выполнять скрипты.
     
  8. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Файл в корне сайта можно упростить.
    Код (Text):
    1. <IfModule mod_rewrite.c>
    2.     Options +FollowSymlinks
    3.     RewriteEngine On
    4.  
    5.     RewriteBase /
    6.  
    7.     RewriteRule ^(.*)/$ $1 [L,R=301]
    8.  
    9.     RewriteRule ^(.*)$ frontend/$1 [L]
    10. </IfModule>
    Код (Text):
    1. RewriteCond %{THE_REQUEST} \?
    2. RewriteRule ^ /404? [R=301,L]
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нафига, интересно?
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    лучше-то оно лучше, но не все хостинги это позволяют. А вот настройки апачи - иногда позволяются.
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну в последнее время я не сталкивался с хостингами, где бы нельзя было. Множество моих сайтов на Yii2 крутятся на обычных шаредах.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @mkramer я так-то лет 10 уже с хостингами не сталкиваюсь. Собственное железо.
     
  13. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я обычно для этих целей использую единую точку входа
     
  14. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Согласен, брат) backend можно на уровень выше поднять. Меня больше интересует frontend.
    По сути вреда не будет никакого. Но хочу максимально обезопасить от ненужных дублей. Ведь site.ru и site.ru?param=1 выдаст одинаковый результат. А я хочу чтобы индекс был чисто по site.ru.
    Так и я использую одну точку входа, но она работает только если файл или директория не существует.
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не, ты не понял. Всё лежит выше Document Root, в Document Root у меня лежит только входной index.php, htaccess, перенаправляющий на него все запросы, стили css и картинки к ним, javascript, и загруженные пользователем файлы, если к ним нужен прямой доступ. Всё остальное - на уровень выше.

    НУ поисковик по своей инициативе туда ?param=1 не подставит. И у тебя реально нет в проекте ни одной формы с методом GET? Обычно какой-нибудь поиск, или фильтрация присутствуют, а их надо сделать методом get, чтоб можно было ссылку с поиска послать другу в контактике :)
    --- Добавлено ---
    Ну так и должно быть. Ты же не хочешь js, css и картинки отдавать через php
     
  16. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    А зачем GET? Можно в роутере распарсить строку и параметры поместить в массив. Согласен что по сути это тоже самое, что и массив GET. Но опять же легче контролировать валидность введённого адреса.
     
  17. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    На фронте js-ом распарсить что-ли, перед тем, как форма отправится на сервер? Делать больше нефига :) Я хочу писать
    Код (HTML5):
    1. <form action="/search"><input name='s'><input type='submit'></form>
     
  18. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    @mkramer зачем js-ом. Строка все равно в роутере парсится. Допустим:
    PHP:
    1. $url = $_SERVER['REQUEST_URI'];
    2. $urlArr = explode('/', substr($url, 1));
    3.  
    4. //$urlArr[0] - контроллер
    5. //$urlArr[1] - экшен
    6.  
    7. //остальное параметры
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Можно. Просто не обрабатывай их.
    Или в точке входа проверяй, если $_GET не пустой, то отдавай 404й заголовой пыхой.
    Еще можно порыться в конфигах пыхи, мб там что есть. Там дохрена всего, так сходу не скажу.
    Но делать так не надо. В этом просто смысла нет.
    Держи - VPS-ы по цене шардов. Пока что нареканий нет. Всем его рекомендую последнее время :)
    А robots.txt тебе на кой? А инструменты вебмастера в гугле и яндексе тебе на кой? Все настраивается же. Все можно указать. Указать, где дубли, куда ходить, куда не ходить. Поисковик не будет портить тебе индексацию, если ты объяснишь ему, как правильно индексировать твой сайт.
    --- Добавлено ---
    Во, чего отрыл - читайвникай.
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну иногда заказчик хочет сам покупать. Обычно мне по-барабану, где это у заказчика крутиться будет. Проблемы бывают, но редко.
     
  21. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Да я это все понимаю) Мне просто чисто теоретически интересно как можно максимально обезопасить сайт от дублей и несуществующих ссылок.

    В общем если кому интересно, пока сделал так:
    Структура приложения:
    Код (Text):
    1. -корень сайта
    2. -|backend
    3. -|frontend
    4. --|images
    5. --|styles
    6. --|scripts
    7. --|index.php
    На продакшене можно указать корнем сайта папку frontend.
    У меня пока в корне лежит .htaccess:
    PHP:
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine On
    3.  
    4. RewriteRule (.+)/$ /$1 [L,R=301]
    5.  
    6. RewriteRule ^.*$ frontend/index.php
    7. </IfModule>
    В папке backend такой:
    PHP:
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine on
    3.  
    4. RewriteBase /
    5. RewriteRule ^(.*)$ /404 [L,R=301]
    6. </IfModule>
    А в frontend такой:
    PHP:
    1. <IfModule mod_rewrite.c>
    2. RewriteEngine on
    3.  
    4. RewriteBase /
    5. RewriteCond %{REQUEST_URI} !^\/frontend/index.php
    6. RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).jpg
    7. RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).png
    8. RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).svg
    9. RewriteCond %{REQUEST_URI} !^\/frontend/style/(.*).css
    10. RewriteCond %{REQUEST_URI} !^\/frontend/scripts/(.*).js
    11. RewriteRule (.*) /index.php?$1 [QSA,L]
    12. </IfModule>
    Ну и прописал в роутере проверку на пустоту массива $_GET. Если не пустой, выдаёт 404 ошибку.
     
    #21 Sergey_Tsarev, 30 май 2017
    Последнее редактирование: 30 май 2017
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я тебе ссылку дал :) Там все написано.

    Тюнил я намедни nginx у себя на фронте, покуривал неспешно документацию. Так вот, GET и все остальные типы запросов, какие только есть, можно отключать аккурат на уровне nginx-а. Скорее всего, и на уровне Папача тоже что-то такое есть.

    Но отрубать GET не надо. GET - это клевый инструмент. Никак понять не могу, чего его все чураются. Причем, блин, чураются те, кто пишут что-то втихоря в долгий ящичек. В то время как воротилы интернета не чураются и активно пользуются, и хрен клали на эти ваши загоны с ЧПУ, которые уже лет 7 как не актуальны для поисковых систем.

    Да и то, теория про то, что поисковикам ЧПУ нравится больше GETа, как по мне - шаманизм и миф, который придумали СЕОшники. Сами придумали, сами уверовали. И стали всем навязывать. Формирователи семантических ядер, блин.
     
    Sergey_Tsarev нравится это.
  23. Sergey_Tsarev

    Sergey_Tsarev Активный пользователь

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Согласен, я думаю что для поисковых систем ссылка она и есть ссылка. Единственное, что наверное будет играть роль это название параметров в GET. Например: http://site.ru?car=toyota&model=camry наверное будет "приятнее" поисковику, нежели http://site.ru?c=1&m=5. Но большой роли играть, я думаю не будет.
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Ну так парси полный адрес, шаг влево, шаг вправо – расстрел, то бишь 404-ая. Для статика – в том же .htaccess можно проверять QUERY_STRING на пустоту, хотя для него это не критично, плюс «версионности» будет мешать. Проще закрыть по-простому: Disallow: /assets/ и т.п. Про PATH_INFO также не забываем – AcceptPathInfo Off и т.п. Примерный .htaccess из наших движков общего назначения, т.е. для обычных сайтов:
    Код (Text):
    1. <IfModule mod_dir.c>
    2. DirectorySlash Off
    3. </IfModule>
    4.  
    5. RewriteEngine On
    6.  
    7. RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
    8. RewriteRule (.*)/*$ http://%1/$1 [R=301,L]
    9.  
    10. RewriteRule (.*)/+$ /$1 [R=301,L]
    11.  
    12. RewriteCond %{REQUEST_FILENAME} !-f
    13. RewriteRule ^.* /index.php
    Естественно, весь код кроме точки входа выше корня/рядом с корнем по др. ветке (при желании можно и .htaccess/index.php убирать из паблик каталога), хотя, если оч. хоЦА, можно добавить что-то вроде RewriteRule ^system/ - [NC,F], но это не оч. надежно. Бэкэнд сайта сюда не нужно приплетать, т.к. это отнимает ресурсы фронтэнда – либо отдельный сайт, либо раздел фронтэнда, либо на крайняк бросаете в корень каталог со своим .htaccess и т.п.
     
    Fell-x27 нравится это.
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Поисковикам плевать.

    Соглашусь с предыдущим оратором - белый список для используемых GET-ов и нет проблем.
    Можно реализовать хоть на уровне веб-сервера, хоть на уровне пыхи.

    Если в качестве фронтсервера используется NGINX, то, наверное, лучше на нем реализовывать. Нечего холостые запросы проксировать до пыхмашины. Дорого это.