Всем привет! Подскажите кто в htaccess хорошо разбирается. В корне сайта лежат две папки backend и frontend. В корне лежит файл .htaccess вот такой: PHP: <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On </IfModule> <IfModule mod_rewrite.c> RewriteCond %{THE_REQUEST} ([^\s]*)\/{2,}(\?[^\s]*)? RewriteRule (.*) %1 [R=301,L] RewriteBase / RewriteCond %{HTTP_HOST} (.*) RewriteCond %{REQUEST_URI} /$ [NC] RewriteRule ^(.*)(/)$ $1 [L,R=301] RewriteCond %{REQUEST_URI} ^/.* RewriteRule ^(.*)$ frontend/$1 [L] RewriteCond %{REQUEST_URI} !^/frontend/ RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ frontend/index.php </IfModule> В backend такой: PHP: <IfModule mod_rewrite.c> RewriteBase / RewriteRule ^(.*)$ /404 [L,R=301] </IfModule> В frontend такой: PHP: <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /frontend/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) /frontend/index.php?$1 [QSA,L] </IfModule> Всё работает нормально. Все запросы перенаправляются на /frontend/index.php. В маршрутизаторе прописал всё вроде правильно написал, если контроллера и экшена не существут, то кидает 404 ошибку. Но если в адресной строке ввести адрес с расширением на конце (http://site.loc/blabla/file.php), то перенаправления не происходит, а тупо срабатывает контроллер по умолчанию. Я так понимаю это из-за вот этих строчек: PHP: RewriteCond %{REQUEST_FILENAME} !-f 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. Буду благодарен за помощь!
Не совсем) Я в целях обучения делаю свой роутинг. А то с использованием фреймворков многие вещи ускользают от понимания и осознания как это работает) За основу я взял структуру и .htaccess из Yii2. Ну хотя структура везде похожа. Не только в Yii. Вот мне интересно как правильно скрыть структуру документа от посторонних глаз и выдавать пользователю только ту информацию, которая предназначена для него. То есть существуют определённые адреса, по которым пользователь может ходить, а если он введёт полный путь др файла или папки, ему бы возвращалась 404 ошибка.
Я всегда стараюсь, чтоб у меня всё, что пользователю не нужно, висело выше Document Root, о чём здесь писали уже. Сейчас даже многие шаред-хостинги это позволяют делать. Тогда все эти пересложнённые htaccess-ы нафиг не нужны, сервер просто никого не пустит выше document root. В публичных папках, куда складываются загруженные пользователем файлы, должно быть запрещено выполнять скрипты.
Файл в корне сайта можно упростить. Код (Text): <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteBase / RewriteRule ^(.*)/$ $1 [L,R=301] RewriteRule ^(.*)$ frontend/$1 [L] </IfModule> Код (Text): RewriteCond %{THE_REQUEST} \? RewriteRule ^ /404? [R=301,L]
Ну в последнее время я не сталкивался с хостингами, где бы нельзя было. Множество моих сайтов на Yii2 крутятся на обычных шаредах.
Согласен, брат) backend можно на уровень выше поднять. Меня больше интересует frontend. По сути вреда не будет никакого. Но хочу максимально обезопасить от ненужных дублей. Ведь site.ru и site.ru?param=1 выдаст одинаковый результат. А я хочу чтобы индекс был чисто по site.ru. Так и я использую одну точку входа, но она работает только если файл или директория не существует.
Не, ты не понял. Всё лежит выше Document Root, в Document Root у меня лежит только входной index.php, htaccess, перенаправляющий на него все запросы, стили css и картинки к ним, javascript, и загруженные пользователем файлы, если к ним нужен прямой доступ. Всё остальное - на уровень выше. НУ поисковик по своей инициативе туда ?param=1 не подставит. И у тебя реально нет в проекте ни одной формы с методом GET? Обычно какой-нибудь поиск, или фильтрация присутствуют, а их надо сделать методом get, чтоб можно было ссылку с поиска послать другу в контактике --- Добавлено --- Ну так и должно быть. Ты же не хочешь js, css и картинки отдавать через php
А зачем GET? Можно в роутере распарсить строку и параметры поместить в массив. Согласен что по сути это тоже самое, что и массив GET. Но опять же легче контролировать валидность введённого адреса.
На фронте js-ом распарсить что-ли, перед тем, как форма отправится на сервер? Делать больше нефига Я хочу писать Код (HTML5): <form action="/search"><input name='s'><input type='submit'></form>
@mkramer зачем js-ом. Строка все равно в роутере парсится. Допустим: PHP: $url = $_SERVER['REQUEST_URI']; $urlArr = explode('/', substr($url, 1)); //$urlArr[0] - контроллер //$urlArr[1] - экшен //остальное параметры
Можно. Просто не обрабатывай их. Или в точке входа проверяй, если $_GET не пустой, то отдавай 404й заголовой пыхой. Еще можно порыться в конфигах пыхи, мб там что есть. Там дохрена всего, так сходу не скажу. Но делать так не надо. В этом просто смысла нет. Держи - VPS-ы по цене шардов. Пока что нареканий нет. Всем его рекомендую последнее время А robots.txt тебе на кой? А инструменты вебмастера в гугле и яндексе тебе на кой? Все настраивается же. Все можно указать. Указать, где дубли, куда ходить, куда не ходить. Поисковик не будет портить тебе индексацию, если ты объяснишь ему, как правильно индексировать твой сайт. --- Добавлено --- Во, чего отрыл - читайвникай.
Ну иногда заказчик хочет сам покупать. Обычно мне по-барабану, где это у заказчика крутиться будет. Проблемы бывают, но редко.
Да я это все понимаю) Мне просто чисто теоретически интересно как можно максимально обезопасить сайт от дублей и несуществующих ссылок. В общем если кому интересно, пока сделал так: Структура приложения: Код (Text): -корень сайта -|backend -|frontend --|images --|styles --|scripts --|index.php На продакшене можно указать корнем сайта папку frontend. У меня пока в корне лежит .htaccess: PHP: <IfModule mod_rewrite.c> RewriteEngine On RewriteRule (.+)/$ /$1 [L,R=301] RewriteRule ^.*$ frontend/index.php </IfModule> В папке backend такой: PHP: <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteRule ^(.*)$ /404 [L,R=301] </IfModule> А в frontend такой: PHP: <IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_URI} !^\/frontend/index.php RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).jpg RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).png RewriteCond %{REQUEST_URI} !^\/frontend/images/(.*).svg RewriteCond %{REQUEST_URI} !^\/frontend/style/(.*).css RewriteCond %{REQUEST_URI} !^\/frontend/scripts/(.*).js RewriteRule (.*) /index.php?$1 [QSA,L] </IfModule> Ну и прописал в роутере проверку на пустоту массива $_GET. Если не пустой, выдаёт 404 ошибку.
Я тебе ссылку дал Там все написано. Тюнил я намедни nginx у себя на фронте, покуривал неспешно документацию. Так вот, GET и все остальные типы запросов, какие только есть, можно отключать аккурат на уровне nginx-а. Скорее всего, и на уровне Папача тоже что-то такое есть. Но отрубать GET не надо. GET - это клевый инструмент. Никак понять не могу, чего его все чураются. Причем, блин, чураются те, кто пишут что-то втихоря в долгий ящичек. В то время как воротилы интернета не чураются и активно пользуются, и хрен клали на эти ваши загоны с ЧПУ, которые уже лет 7 как не актуальны для поисковых систем. Да и то, теория про то, что поисковикам ЧПУ нравится больше GETа, как по мне - шаманизм и миф, который придумали СЕОшники. Сами придумали, сами уверовали. И стали всем навязывать. Формирователи семантических ядер, блин.
Согласен, я думаю что для поисковых систем ссылка она и есть ссылка. Единственное, что наверное будет играть роль это название параметров в GET. Например: http://site.ru?car=toyota&model=camry наверное будет "приятнее" поисковику, нежели http://site.ru?c=1&m=5. Но большой роли играть, я думаю не будет.
Ну так парси полный адрес, шаг влево, шаг вправо – расстрел, то бишь 404-ая. Для статика – в том же .htaccess можно проверять QUERY_STRING на пустоту, хотя для него это не критично, плюс «версионности» будет мешать. Проще закрыть по-простому: Disallow: /assets/ и т.п. Про PATH_INFO также не забываем – AcceptPathInfo Off и т.п. Примерный .htaccess из наших движков общего назначения, т.е. для обычных сайтов: Код (Text): <IfModule mod_dir.c> DirectorySlash Off </IfModule> RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.(.+) [NC] RewriteRule (.*)/*$ http://%1/$1 [R=301,L] RewriteRule (.*)/+$ /$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^.* /index.php Естественно, весь код кроме точки входа выше корня/рядом с корнем по др. ветке (при желании можно и .htaccess/index.php убирать из паблик каталога), хотя, если оч. хоЦА, можно добавить что-то вроде RewriteRule ^system/ - [NC,F], но это не оч. надежно. Бэкэнд сайта сюда не нужно приплетать, т.к. это отнимает ресурсы фронтэнда – либо отдельный сайт, либо раздел фронтэнда, либо на крайняк бросаете в корень каталог со своим .htaccess и т.п.
Поисковикам плевать. Соглашусь с предыдущим оратором - белый список для используемых GET-ов и нет проблем. Можно реализовать хоть на уровне веб-сервера, хоть на уровне пыхи. Если в качестве фронтсервера используется NGINX, то, наверное, лучше на нем реализовывать. Нечего холостые запросы проксировать до пыхмашины. Дорого это.