nginx и .htaccess файлы. Как подружить?

Автор Macintosh, 10 декабря 2012, 10:40:02

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Macintosh

Всем приветик! Можно ли как-то nginx заставить читать файлы .htaccess? Буду рад любым советам и методам, только пожалуйста поподробнее (в пошаговом режиме).
Наткнулся на такой модуль mod_aclr2, но толком не фига не понял, понял только принцип его действия, но вот как это все настроить не понял. И насколько это эффективное решение и стоит ли им пользоваться вообще? Опять-же если кто-то пользовался mod_aclr2 то дайте пошаговую инструкцию как это все настроить?

corner

Вообще это и не нужно, у nginx есть свой ngx_http_rewrite_module. А использование nginx в качестве proxy - уже вчерашний день. Nginx справляется со всеми задачами, в том числе с php, быстрее apache. Кстати, сам Apache для улучшения производительности не рекомендует использовать .htaccess, перенося правила rewrite в конфиг сайта.
А так, посмотрите здесь http://habrahabr.ru/sandbox/45470/

Macintosh

#2
Цитата: corner от 10 декабря 2012, 12:26:32
Вообще это и не нужно, у nginx есть свой ngx_http_rewrite_module. А использование nginx в качестве proxy - уже вчерашний день. Nginx справляется со всеми задачами, в том числе с php, быстрее apache. Кстати, сам Apache для улучшения производительности не рекомендует использовать .htaccess, перенося правила rewrite в конфиг сайта.
А так, посмотрите здесь http://habrahabr.ru/sandbox/45470/
По поводу того что .htaccess враг производительности, я вкурсе, этот файл перечитывается при каждом запросе )) Но вот например ситуации такие, первая это хостинг, где у пользователей скрипты со своими .htaccess в том числе там и ЧПУ и куча прочих настроек. Но у меня не такая проблема, в моем случае, мой скрипт, каждый месяц создает новую папку, и нужно закрыть доступ к этой паке, для этого я, точнее скрипт который я разрабатываю генерирует вместе с папкой, файл .htaccess который и блокирует доступ в эту папку. А заблокировать туда доступ в основных конфигах, ну я во всяком случае не придумал как, возможно я не очень еще хорошо знаю Apache, но по моему с регулярками в блочной директиве <Derectory> работать нельзя. Если можно дайте где об этом почитать можно? Регулярные выражения знаю очень хорошо, а вот можно ли их использовать в Apache об этом информации не нашел. Зато в Nginx есть регулярки например я в location задал регулярку что если запрос на паку такуе-то то отдает запрос Apachу. По сути то я проблему решил, но чисто в целях изучения меня и интересует этот вопрос. По поводу Nginx без Apache в качестве бекэнда, это спорный вопрос, в интернете куча инфы об этом, но я так и не понял до конца, какое все таки принять решение, отказаться полностью от Apache, даже не знаю, я на нем учился, и отказаться от него даже страшно )))) К таму-же как я понял, Apache лучше работает с динамикой, а Nginx cо статикой. По поводу ссылки что вы дали я ее уже читал, я уже перелопатил весь интернет. Нет подробной пошаговой инструкции. А хотелось бы в деталях.

Сообщение объединено: 10 декабря 2012, 13:03:53

Пока писал ответ пришла в голову мысль )) Устанавливать права доступа на папку при ее создании, средствами PHP. Я их и так задавал на 777 но вот нужно покумекать какие атрибуты задать что бы PHP в нее писать мог и доступа кроме него никому к этой папке не было.

corner

Ну, во первых, права 777 в папках сайта - это, мягко говоря, моветон.
Второе, раз вы знаете, что создает ваш скрипт, ну так и опишите это в конфиге сервера.
После долгих исканий документации по Apache читаю теперь apache.org. Там точнее. То же самое касается и nginx.
У себя перевел все на nginx. Скрипты работают через fastcgi. При использовании фреймворков настройка производится очень просто без rewrite (Phalcon, Laravel). Хотя, уже, наверное, и с фреймворками пора завязывать. Только тормозят...

По поводу регулярок в <Directory> - наверное, нужно сначала почитать документацию, но не блоги около нее... http://httpd.apache.org/docs/2.2/mod/core.html#directory. Там английским по-белому указано, как последние использовать.  :)
P.S. Вот подумываю от PHP отказаться тоже.  :)
От MySQL уже почти ушел. Некоторые вещи перекинул на Redis, что-то на MongoDB.

Macintosh

#4
Ну права 777 на папку, в эту папку пользователи сайта закачивают картинки, но эти картинки не выводятся на прямую на сайте. Тоесть обрисую подробно, сайт который разрабатываю это сайт с обоями для рабочего стола, пишу для себя не под заказ и т.д. Так вот например пользователь закачивает картинку на сайте, она помещается в папку, ну например /uploads/images/original. Так же при загрузке картинки, делаются 3 привьюшки разных размеров, и помещаются в соответствующие папки, например /uploads/images/big, /uploads/images/small ну и т.д
Вот папку original нужно защитить от того что бы ее всякие школохакеры не выкачали целиком и не выложили потом в паблик с подписью вот весь архив с сайта такого-то юзайте, в то время как все картинки которые будут качаться с моего сайта, будут с копирайтами, а копирайт будет ставиться уже при ресайзе. Ну например пользователь выбрал разрешение 1920х1200, скрипт берет оригинальную картинку, ресайзит ее и ставит копирайт. А если юзеры уже хотят снять копирайт, то покупайте премиум аккаунт. Ну а если у меня сопрут весь архив картинок, то смысл платных сервисов на данном ресурсе сведутся к нулю ))) Ну как-то так! А папки у меня арганизованы так что каждый месяц, для всех картинок создается новая папка вида 12-2012 в следующем месяце 01-2013 и так далее. Тоесть путя к папке еще не существует что бы задать для него правила в конфигах Apache, точнее без регулярного выражения это не реально. По поводу сайта  apache.org, я инглишь знаю не плохо, но не настолько хорошо, что бы на нем читать да еще и тех документации ))) С Nginx проще он наш родной там документация на русском, хотя я ее только бегло пробежал еще не читал полностью, Nginx начал рассматривать только 2 дня назад )) По поводу fastcgi, php-fpm и так далее, ну вот сейчас еще разок прошелся по паре статей на томже хабре, ну ни вижу я особого смысла, может на каком нибудь дешевом VPS-конфигурации: 5Gb HDD, 256Mb RAM в этом и будет смысл, ну а на моем Intel Xeon E3-1275 v2 3.5GHz, 16гиг RAM и я могу еще поставить 16 в любой момент )) Ну мне кажется в этом нет смысла, и Apache в связке с Nginx отлично разрулят пару нагруженных сайтов. По поводу ссылочки на описание того что регулярки в <Directory> все-же можно использовать спасибо, не знал, хотя и лазил там в документации, но не заметил ))) По поводу того что вы от всего отказываетесь, точнее от Apache, PHP, MySQL, ну это конечно для меня вообще не приемлемо, я привык к ним, я их уже изучаю не один год, и по мимо них еще кучу чего изучаю, сейчас вот взялся плотняком за серверное программное обеспечение, за Linux в целом, да и еще куча куча всего. И сейчас мне еще менять все уже мое восприятие этого мирка, на абсолютно не знакомый мне мирок, это крах мозга, и еще потерянные месяцы жизни а то и годы ))))))))))))

Сообщение объединено: 10 декабря 2012, 14:04:01

И по поводу фреймворков, я ими не пользуюсь вообще, во первых так ты не понимаешь что и как у тебя устроенно, до мелочей, во вторых это лишний код, и естественно лишняя нагрузка, и это все на ООП. А я пишу процедурным методом, с использованием ООП только в тех местах где это действительно удобно и необходимо.

corner

#5
/uploads/images/original вообще закройте от внешнего мира, скрипт по обработке все равно ее обработает. Можно повесить ее на внутреннего юзера и назначить файлам соответствуюшие права.
Например, есть юзер VASJA, сервер же работает от юзера WWW-DATA.
Обычно права на файл ставятся 644, т.е. писать и читать может владелец, группа - читать, остальные читать. Т.е. VASJA пишет и читает, WWW-DATA читает. Ставим права 600 - теперь VASJA пишет и читает, остальные, в том числе WWW-DATA - ничего сделать не могут. И rewrite не нужен. Скрипт будет иметь доступ, потому что работает от VASJA. А в папку для быдлоюзеров киньте заглушку index.html пустую, ну или с шуткой какой-нибудь.
Это не винда, здесь все строго исполняется так, как хочет администратор системы.
Короче, подробнее почитайте о правах на файлы, ну и, конечно, как работают, в смысле взаимодействия с системой на уровне прав, серверы.
Удачи.

P.S. Чем мощнее сервер (и по RAM ресурсу), тем более на нем не нужен PHP, MySQL, ну и Apache.  :)

Macintosh

#6
Да по поводу прав доступа тут и нужно кумекать. Я и сам об этом уже сижу думаю. Хотя не понял нафига там index.html, если доступа к папке не будет, у меня там будет 403 ) index.html ложится для того что бы не было видно содержимого каталога из браузера. А если я обращюсь напрямую к каталогу например так _http://site.com/uploads/images/12-2012/originals/1.jpg, то легко получу к ней доступ, или вообще напишу скрипт с регуляркой который подконектиться и выкачает все содержимое каталога или тех же картинок *\.jpg ))))). Да и вообще вы не забывайте что браузер это просто программа (клиент) клиентом может быть не только браузер. )) Так что index.html в данном случае не нужен, там будет строгие права на доступ и при попытки конекта к каталогу будет выдаваться 403я )) Ладно спасибо, сейчас подумаю как правильно организовать владельца и права на этот каталог ))

corner

#7
Цитата: Macintosh от 10 декабря 2012, 14:22:04А если я (КТО Я?) обращюсь напрямую к каталогу например так _http://site.com/uploads/images/12-2012/originals/1.jpg, то легко получу к ней доступ, или вообще напишу скрипт с регуляркой который подконектиться и выкачает все содержимое каталога или тех же картинок *\.jpg ))))). Да и вообще вы не забывайте что браузер это просто программа (клиент) клиентом может быть не только браузер. ))
"Клиентом" - да, но клиент обращается к серверу, а сервер работает от назначенного ему пользователя!!!
Вот такая, ..., технология. И вообще, все тупее, чем вам кажется. Внимательно перечитайте то, что написали, и найдите противоречия.

Клиент обращается к серверу, сервер принимает запрос и дает ответ (например через скрипт)... Серверу, мягко говоря, все равно какой клиент к нему обратился. Только сервер обрабатывает запросы, от всех клиентов!

Macintosh

#8
corner
Короче мы просто не правильно друг друга поняли )) Не хочу дальше усугублять непонимание )) Проехали!
У меня проблема такая, я не совсем понял что вы там имели введу по поводу создания другого Юзера. Вот смотрите!
Я понимаю что в Unix подобных операционных системах, есть пользователи и группы, я понимаю что у всех файлов и каталогов, есть создатель, группа, и права доступа создатель:групп:остальные(не вошедшие в группу). И права для каждого из них отдельные и т.д и т.п. Это я написал что бы вы не говорили разберись с правами, пользователями и группами в целом. С этим я давно разобрался и вродебы все понял. Хотя и не до конца ) В плане приложений, как они работают, я имею введу Apache и PHP.
У меня такая проблема, что-то я не докумекаю до конца ее ))
Смотрите, пользователь, обращается к серверу он работает под пользователем www-data, тоесть фактически все кто из вне обращаются к серверу работают как www-data. Это тоже все понятно и ясно. PHP он работает как модуль Apache и следовательно тоже работает как пользователь www-data. Получается у нас, что пользователь он же www-data  может закачать файл в каталог /images. Но ведь PHP он же тоже www-data )) у пользователя доступ к каталогу должен быть только на запись, а у PHP и на чтение и на запись ))) Что-то я совсем запутался, растолкуйте пожалуйста если вы поняли мою мысль, я вот этого и не могу понять, как это работает в Linux )

corner

#9
Скрипт (PHP в данном случае) может записать загруженный файл в любую директорию, к которой имеет права доступа, и эта директория необязательно должна быть видима серверу. Сервер только лишь запускает скрипт и передает ему параметры. Уловили мысль? Т.е. вы можете создать в любом месте директорию для хранения загружаемых пользователями файлов. Эта директория не будет видна из "мира".
Например, у вас публичный каталог на сервере (на диске) - /home/vasja/www/public . Сервер настроен на показ этой директории и ее дерева (вниз). Вверх он не пройдет. Но скрипт, запущенный сервером, может ходить где угодно по дереву каталогов (директорий), куда у него (скрипта) есть права на доступ. В данном случае, например, вы создаете директорию  /home/vasja/www/uploads/original . К этой директории скрипты PHP будут иметь права (если у файлов и папки пользователь www-data), но сервер видеть эту папку не будет, потому что он имеет доступ к /home/vasja/www/public и ниже.
Дальше  - ваше приложение обрабатывает только закачку файлов в директорию /home/vasja/www/uploads/original, после чего необходимым образом обрабатывает файл и результат выкладывает (сохраняет) в одну из нижележащих папок  /home/vasja/www/public, например /home/vasja/www/public/promo/wallpapers, к которой уже есть публичный доступ, но вы уже там везде прописали авторство Маркиза-Карабаса.
Как видите, ничего сложного.
P.S.
Сервер видит только указанный ему каталог и может "прогуляться" ниже, но не выше.
Из этого же каталога, или дочернего ему, сервер может запустить скрипт (приложение PHP).
А уже это приложение (скрипт), хотя и имеет права такие же, как и сервер, може ходить и выше по каталогам, куда будет иметь соответствующий доступ. Например, может прочитать содержимое файла /etc/hosts, или даже /etc/passwd  :o
Но пугаться этого не нужно, потому что скрипты (приложения) создаете вы , а не пользователь браузера.

Macintosh

Все равно немного не понял, почему у скрипта отличаются права от Apache? ведь они оба работают от имени пользователя www-data ) Вот тут по подробнее пожалуйста.
Смотрите когда скрипт создает папки и каталоги, то владельцем этих папок становится www-data, так я как бы и начал понимать что как сервер так и скрипты которым он передает управление работают как пользователь www-data. Почему тогда у них разные права? Бррр... Немного прояснилось, но не до конца, запутался я снова ) Где-то просто основ не пойму )

corner

#11
Да все просто. Сервер работает только в указанном ему каталоге. Все. Примите как аксиому. Тем более так оно и есть. Т.е. сервер показывает входящему только определенные конфигом директории. Ну как аналог, можно привести shared директории.
А скрипт, и скрипт PHP в том числе, это программа, он работает в пространстве, определеном ему системой. Скрипт может читать и записывать любые файлы где угодно в системе (в файловой системе) где есть соответствующий доступ. Это внутренняя программа системы. В данном случае. Его создаете вы. И делает он то, что вы ему определите.

Конечно, вы можете написать скрипт (программу), которая разрешит удаленным пользователям создавать и запускать на вашей машине (сервере) свои программы, но это уже другая история.  :)

Macintosh

#12
То есть сервер имеет доступ только туда где я ему указал в конфиге, ну например /home/mac/www/ выше ясное дело он не может подняться, а сам скрипт может подняться хоть в папку /etc/ и что-то там делать, если только у этой папки например права, ну к примеру rwxrwxrwx. Вы об этом? То есть если я например напишу

<directory ~^/uploads/images/[0-9]{2}-[0-9]{4}/original_images/$>
    Order Deny,Allow
    Deny from all
</directory>

То из вне ни у кого доступа к этой папке не будет, а скрипт сможет в этой папке делать все что угодно? Вы об этом? Я как бы это понимаю ) Хотя сейчас еще лучше понял и закрепил, спасибочки, но вот а как, тогда без директив апача, права назначить, что бы доступа к каталогу не было из вне а php мог работать с этой папкой? Вот тут немного все-таки так и не понял.

И еще по поводу регулярки в конфиге, вместо файла .htaccess. Тут одно слабое место, в конфиге я то регулярку прописал, но конфиг читается при старте сервера, а каталоги 12-2012, 01-2012 и т.д будут создаваться каждый месяц, а сервер может не перезагружаться и годами ))) Тоесть он как в этом случае работает? Тут тоже немного не понятка! Или всеже он будет понимать и новые каталоги по этому регулярному выражению? Или только те что были на момент загрузки сервера?

corner

 :)
Я о том, что вам вообще не нужно указывать серверу эту папку, эта папка ваша, и пользователи ресурса к ней не имеют отношения. Вы принимаете файл, после чего ваш скрипт запишет его в указанную вами директорию. А удаленному пользователю здесь делать нечего, он нам здесь не нужен, пусть пока погуляет, нам и самим тут хватает забот.  :)

Macintosh

Цитата: corner от 10 декабря 2012, 18:08:16
:)
Я о том, что вам вообще не нужно указывать серверу эту папку, эта папка ваша, и пользователи ресурса к ней не имеют отношения. Вы принимаете файл, после чего ваш скрипт запишет его в указанную вами директорию. А удаленному пользователю здесь делать нечего, он нам здесь не нужен, пусть пока погуляет, нам и самим тут хватает забот.  :)
А то-есть изначально на эту папку, когда ее будет генерировать скрипт, указать права доступа например 600? Как-то так?