pavki/hr_qa_sbs_best_bad huggingface dataset:
Вопрос: Как грамотно «переехать» на Nginx+Apache?

Лучший ответ: ну а как иначе? 80й - то порт один, не поделишь
1) ставишь nginx на 8080 или 81 или какой хочешь
2) ручками пишешь все конфиги в один файл или бьешь его на части как угодно в папке sites-enabled (необязательно по именам доменов называть, но, понятно, что так проще поддерживать), но по-быстрому можно и в одну простыню копипаст
3) в конфигах прописываешь откуда дергать статику каждому домену и прокси на Апач
4) тестируешь, меняешь порты с Апачем местами

Худший ответ: Тебе придется прописывать каждому сайту конфиг. Можно написать небольшой скрипит на bash, скормить ему образец, по которому он будет формировать основной коняги(или несколько, по именам сайтов). Скрипт написать, потребуется минут 10-15 от силы, а руками переписывать каждый конфиг, куда дольше. Да еще и запутаться просто и ткнуть не то.
логика такая:
1. Запускаешь парсинг конфига апача, выдергиваешь из него имена сайтов и складываешь во временный файлик $file=/tmp/$RANDOM
2. Запускаешь цикл, в котором опрашиваешь созданный файл $file и считываешь построчно каждый сайт, записывая в переменную, скажем $domainname.
3 внутри цикла, копируешь содержимое исходного файла конфига nginx с заменой определенного выражения внутри конфига, скажем DOMAIN_NAME, на значение переменной $domainname.
Подготовительные работы: Создание исходного конфига, внутри которого вместо адреса сайта добавлено кодовое слово, скажем DOMAIN_NAME, которое мы впоследствии, с помощью sed сможем заменить.
Вопрос: Как программно (JavaScript, css) запретить быстрый поиск в Firefox9?

Лучший ответ: Думаю что никак. Хоткеи приложения, по логике, должны быть приоритетнее всяких там открытых страничек.

Худший ответ: Ну а как вы сейчас перехватываете?
Вопрос: Подскажите, что за шрифт

Лучший ответ: Похоже на Turbota
new.myfonts.com/fonts/andrijtype/turbota/

Худший ответ: Есть сайт который может определять шрифт по изображению только вот забыл адрес. Погугли.
Вопрос: Почему не запускается Android-эмулятор?

Лучший ответ: Лучше сразу начинай пользоваться эмулятором genymotion. Он пошустрее и функций в нем больше. На офф сайте есть подробные инструкции как поставить и подключить к компилятору.

Худший ответ: при запуске эмулятора у него появляется свой IP адрес и порт, по которому с ним можно связаться. попробуйте попинговать этот хост или связать adb принудительно с ним командойadb connect ip:port
Если такого не происходит, то смотрите почему не дается связаться.
Вопрос: Uncomplicated Firewall(ufw)?

Лучший ответ: > Подскажите решение — как дать доступ 127.0.0.1(localhost'у) к порту 8080, исключив доступ всех остальных(извне) к нему, с помощью утилиты ufw в ubuntu?

Может быть, биндить сервис, который слушает на этом порту, только на локальный интерфейс (lo)? Тогда даже без фаерволла нельзя будет к нему снаружи подключиться. У многих стандартных сервисов (apache, nginx, FTP демоны) есть опции в настройках, выбирающие сетевые интерфейсы, на которых они слушают сокеты.

Худший ответ: sudo ufw allow from 127.0.0.0/8 to tcp port 8080
sudo ufw allow from any to tcp port 80
А запрещать внешние соединения оно и так должно.
Вопрос: Куда пропал SkypeKit for Linux?

Лучший ответ: Всё лежит в SkypeKit for Embedded и включает библиотеки для .net, java, c++ и python.
Последнюю версию можно взять тут :)

Худший ответ: Так они вроде прикрыли эти штуки уже давно.
Для гейта звонков вроде у них какой то сип шлюз есть.
Вопрос: Как сделать, чтобы скрипт выполнялся после загрузки страницы?

Лучший ответ: Если нет крайней необходимости ждать полной загрузки страницы: изображений, видео, etc (что бывает крайне  редко), а достаточно дождаться, пока браузер загрузит DOM (проще говоря, структуру HTML), то используйте  событие "DOMContentLoaded":document.addEventListener('DOMContentLoaded', function(){

    // весь ваш код тут

}, false);Второй вариант, который рекомендует тот же Google, это разместить все JS-скрипты в конце документа. Например, перед закрывающим тегом </body>

Худший ответ: Если нет крайней необходимости ждать полной загрузки страницы: изображений, видео, etc (что бывает крайне  редко), а достаточно дождаться, пока браузер загрузит DOM (проще говоря, структуру HTML), то используйте  событие "DOMContentLoaded":document.addEventListener('DOMContentLoaded', function(){

    // весь ваш код тут

}, false);Второй вариант, который рекомендует тот же Google, это разместить все JS-скрипты в конце документа. Например, перед закрывающим тегом </body>
Вопрос: Iphone 4 Gevey?

Лучший ответ: Пользуюсь Gevey…

Мой совет, берите neverlock.

Худший ответ: SimFree однозначно.
Вопрос: Как поведет себя RAID 1?

Лучший ответ: Без бекапов ваши операции это как стрелять себе в ногу, есть конечно шанс, что промахнетесь, но куда вероятнее вы себе отстрелите ногу.

Худший ответ: бэкап - новый рейд - развернуть бэкап. Это если реально важны данные на сервере
А если нет, все способы примерно одинаково "полезны" =)
Вопрос: Как максимально быстро и эффективно уничтожить данные на HDD?

Лучший ответ: Сделать "опасный HDD" внешним и держать всегда наготове  молоток.

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

Лучший ответ: не вижу смысла для вас в каких-то курсах, они обычно составляются для совсем нулевых.
Попробуйте лучше реализовать какое-нибудь приложенице для личных целей (может тудушка какая, может еще чего для планирования своего времени) на каком AngularJS, и норм.

Худший ответ: не плохие курсы по js javascript.ru/courses
Вопрос: Что не понравилось Роскомнадзору в статье про пиво?

Лучший ответ: С точки зрения 15 статьи ФЗ №149 крамольным легко может оказаться приведенный в заметке стишок. Особенно, если прочитать его не целиком, а выхватив отдельные строки: "Наркотики в вены вливайте богато", "Так вешайся, быдло", то этого уже достаточно, чтобы говорить о пропаганде суицидов и наркотиков. Особенно, если кому-то понадобился повод для удаления подобной статьи с сайта.

Худший ответ: А что там было хоть? Может откроете доступ для иностранных IP?
Вопрос: Насколько хороша либо плоха сильная связанность в Yii, и возможно ли сделать подобие Service Locator для Yii?

Лучший ответ: Не компонент, а например модель для модуля User, при этом чтобы все модули которые используют эту модель получали уже новый класс.
Модель - это частный случай компонента. Для них тоже можно использовать механизм DI.
Например вместо$u = new User();
 можно везде писать $u = Yii::cretateComponent($configManager->getConfig('user'));
где $configManager - это какой-то ваш достаточно простой объект, который загрузит из единого конфига информацию по слову "user" и вернет ее в виде массива. В этом массиве можно задать поле class - собственно экземпляр этого класса и будет создан функцией Yii::createComponent.

Худший ответ: То есть Вы хотите переопределить компонент? В чем проблема? Указываете нужный класс в конфиге, в разделе components.
Вопрос: Не соблюдение авторских прав или перепост и незачем тут шуметь?

Лучший ответ: Таких сайтов-сателлитов просто миллион. Сеошники, мать их.

Худший ответ: Давеча тоже наткнулся на такой сайт. Там статья которую здесь забанили, без комментов, без ссылок.
Наверное администрации хабра стоит им черкнуть.
Вопрос: Как в Питоне проверять есть ли подключение к интернету?

Лучший ответ: Можно как-то так: import subprocess

internet = False
while not internet:
    try:
        subprocess.check_call(["ping", "-c 1", "www.google.ru"])
        print("Internet is up again!")
        internet = True
    except subprocess.CalledProcessError:
        print("Internet is still down :(")

Худший ответ: import urllib
try:
    urllib.urlopen("http://google.com")
except IOError:
    "Google is not available! Internet is broken!"
P.S. Советую совместить с subprocess от Yuri Shikanov
Вопрос: Как установить Skype 4.3 на Ubuntu 14.04 LTS x64?

Лучший ответ: Сегодня боролся с подобной фигней. Помогло следующее:
apt-get -f install # покажет вам список проблемных зависимостей
sudo dpkg -r имя_зависимости # для удаления
далее делаете:
sudo apt-get autoremove && apt-get autoclean 
Пробуйте поставить Skype

Худший ответ: sudo software-properties-gtk
На второй вкладке включить партнеровsudo apt-get update
sudo apt-get remove skype skype-bin:i386 skype:i386
sudo apt-get install sni-qt:i386 skype
Если не идет - пишите где затык.
Вопрос: Как раскрутилась quora.com?

Лучший ответ: Я думаю, тут четыре основных причины:
1. Севис Quora создали люди, которые были у истоков Facebook. Этот факт активно муссировался в IT-прессе на момет запуска сервиса.
2. Сервис сразу же стал позиционироваться как коллективная база знаний (типа википедии), построенная на мнениях авторитетных экспертов. И действительно, на сервис сразу же пришло много знаменитостей из IT. Наверняка тут опять же большую роль сыграло престижное происхождение основателей и их связи. 
3. Сервис возник на волне тренда по созданию сервисов вокруг графа интересов, а не социального графа (вокруг которого строились до этого все социальные сети). Я немного писал на эту тему: geektimes.ru/post/129488/. Много сервисов тогда пытались воплотить на практике новую концепцию, но у Quora это получилось лучше всех.
4. С самого начала сервис был очень качественным, лично меня особенно привлекала система коллективного редактирования контета, которая была и остается очень дружелюбной пользователю, в отличие от той же системы в Википедии.

Худший ответ: + Персонализированные email рассылки, основанные на анализе твоих прошлых активностей. Поощрение распространения вопросов через социальные сети. Возможность узнать ответы только после регистрации.
Вопрос: Зачем рейтинг на toster.ru?

Лучший ответ: Система рейтинга на Тостере сейчас в зачаточном состоянии. Скоро он будет иллюстрировать вклад каждого в тот или иной тег. Можно будет видеть самых компетентных по каждой теме. Таким людям можно будет доверить некоторые модераторские функции. Их же можно будет рекомендовать авторам вопросов в качестве экспертов, которых можно позвать в свой вопрос (за дополнительные бонусы). Можно будет настроить себе ленту, чтобы получать вопросы только от людей с определенным рейтингом.
Рейтинг на Тостере пока никак не связан с Хабром. Но есть идея в будущем на профиле Хабра выводить блок репутации, заработанной на Тостере. И наоборот, на профиле Тостера выводить блок заработанной репутации на Хабре.

Худший ответ: Помочь определиться клиентам хантим и брейнсторадж?
Вопрос: Как правильно сформировать SQL запрос?

Лучший ответ: записей в таблице products очень много ( около 1млн ) 
это не много, это нормальнои запросы типа JOIN не предлагать, так как оно существенно влияет на производительность
а этот бред вы как догадались сюда приплести? У вас наоборот с выходом из внутренних джоинов выборка по ид будет сокращаться, в итоге по таблице продуктс будет только джоин нужных ид(что аналогично выборке where in, только с меньшими ограничениями, например ордер и лимит). По этому сджойнте мелкие таблицы, получите с них модел_ид, и по нему уже джоин продкут. 
Я бы денормализовал продуктс, внес бы еще брэнд_ид в него, но это так, мелочи.

Худший ответ: Как уже сказали, вы не там смотрите. 1 млн — это немного, и запрос, даже с JOIN — очень простой, любая СУБД должна проглатывать его не поперхнувшись.
Скорее всего, вам надо тюнить настройки своей БД, там явно что-то не в порядке. Вот, например, статья для PostgreSQL: https://ruhighload.com/%D0%A2%D1%8E%D0%BD%D0%B8%D0...
Еще подобные статьи не раз публиковались на Хабрахабре.
Для начала надо показать здесь вывод EXPLAIN ANALYZE запроса (или аналог для вашей СУБД).
Вопрос: Как убрать галочку на ярлыке?

Лучший ответ: Правой кнопкой по рабочему столу -> обновить

Худший ответ: Очень похоже на overlay значок какого нить SVN или облачного хранилища. У вас часом вся эта папка (Desktop, я полагаю) не в облаке или репозитории?
Вопрос: Куда податься девушке в IT?

Лучший ответ: Есть факторы объективные. Например, объективный фактор привел Сергей - молодые девушки могут внезапно уйти в декрет. Поэтому на долгосрочный проект, в котором 1-3 разработчика девушек берут с неохотой.
А есть множество субъективных факторов. Один из них, мужской шовинизм.
Увы, с проявлением мужского шовинизма сталкивался многократно. 
Иногда он был обусловлен реальным личным опытом руководителей и неправильным обобщением. Например, взяли девочку - не потянула, вывод - все девочки не тянут. Там была ситуация, что те задачи, которые дали той девочке, с той моделью управления проектом (то есть, вообще без управления), она не потянула. Зато потом нашла себя в другой области разработки с другим подходом к управлению проектами.
Мне приходилось под личную ответственность настаивать, чтобы взяли девочку. Я-то точно знал, что девочка - супер, она одна стоит половины имеющейся команды (чисто мужской на тот момент). Убедил, переломил сознание руководства. Потом еще нескольких девочек взяли, правда не все они были столь же успешными, как первая. Потом, когда половина мальчиков разбежалась девочка до последнего тянула проект. Но в другой раз (в другой компании) такой номер не прошел - я не смог сломить позиуи руководтва.
Про управление проектом я не просто так сказал - девушки, как правило, хуже работают в условиях прессинга (об этом тоже в комментарии @bk0011m). Девушку сложнее заставить поработать вечером или в выходные. Это значит, что надо руководителю придется повышать качество управление проектом. То есть, самому тоже придется работать. 
Также проблема, что у женщин ниже самооценка. Сейчас не поделюсь пруфлинком, но попадалась статья, в которой описывается, что женщины, претендующие на позиции программиста обладают, в среднем, более высокой квалификацией по требуемым для вакансии технологиям, но мужчин, претендующих на эту вакансию больше. Это не потому, что мужчин, среди программистов на порядок больше (хотя их действительно больше, но не настолько). А потому что женщина видя в описании вакансии список технологий, будет претендовать на эту вакансию только если абсолютно уверена, что она во всех этих технологиях специалист. А мужчина подаст на эту вакансию даже если хорошо знает только одно, а про остальное что-то слышал.
Все это приводит, к тому, что в этой отрасли мужчин больше.
Что делать конкретно Вам, сказать не могу. Но совершенно точно могу сказать, что надо себя уметь презентовать. Например, участие в open source проектах или, еще лучше, обственные открытые проекты на github точно помогут. Статьи на habrahabr. 
Почитайте: https://risik.info/?p=558 и https://risik.info/?p=555 вдруг как-то поможет :)
Ну и конечно: femalesoftwareeng.tumblr.com

Худший ответ: не знаю, работал не однократно с программистами женского пола, никаких стереотипов на их счет небыло, я тут думаю главное прямые руки, а не пол. Хотя может у вас город сексистов)
Вопрос: Что почитать, чтобы понимать синтаксис ОПП в PHP?

Лучший ответ: Форумы и документация это конечно хорошо, но если вы не знакомы с ООП и только начинаете, то лучше - читайте книги. Для постижения азов рекомендую:Самоучитель PHP 5/6, Кузнецов, СимдяновPHP 5 (в подлиннике)
Если не любите читать большие толстые книги, то можете просто прочитать главу по ООП в любой из этих книг.
Что касается момента с $jsonError->error='No function called';, PHP в данном случае неявно создаёт объект stdClass. Делать так не желательно, т. к. PHP сделает предупреждение: Warning: Creating default object from empty value. 
Лучше писать так:<?php
header('Content-type: text/html; charset=UTF-8');
if (count($_REQUEST)>0){
    // ...
}else{
    $jsonError = new stdClass();
    $jsonError->error = 'No function called';
    echo json_encode($jsonError);
}
?>
Результат будет тот же самый, но никаких предупреждений уже не будет.смысл $this нигде не объясняютhttps://php.net/manual/ru/language.oop5.basic.php
Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект. Обычно это тот объект, которому принадлежит вызванный метод, но может быть и другой объект, если метод был вызван статически из контекста другого объекта.return $this - делается это для реализации цепочек вызовов (Method Chaining).www.wisereport.ru/method_chaining

Худший ответ: PHP. Объекты, шаблоны и методики программирования
Желательно на английском читать т.к. русская версия слегка устарела.
Вопрос: MVP как правильно вернуть переменную во ViewModel прогрессбара?

Лучший ответ: Вот тут
А ещё кури в сторону:
- InvokeRequired
- SynchronizationContext
Это вопрос доступа к элементам управления из стороннего потока.

Худший ответ: Посмотреть бы на код, который регулярно считывает progressVal из модели и пихает в прогресс-бар. Иными словами, SetValProg откуда еще вызывается, кроме как при старте? Лично я пока не вижу никакой проблемы с потоками, про которую говорит tex0, т.к. из другого потока устанавливается только интовое поле у Model.
Вопрос: Куда писать статьи, если нехватает кармы даже на песочницу?

Лучший ответ: С тремя ошибками в двух предложениях вопроса? Даже не знаю. В школу, на курсы русского языка?

Худший ответ: Куда писать, куда писать. Пишите в стол (в черновики). Будет возможность — опубликуете. Ну или попросите кармы на публикацию готовой статьи.
Вопрос: Как лучше организовать английскую версию сайта asp mvc?

Лучший ответ: Чуть-чуть не по теме, но важная информация:
ru.site.com - вот этот вариант. Я так понимаю, что гео будет разное для русской и английской версии. Когда будете кормить поисковик, укажете для каждого домена 3го уровня разный геотаргетинг. Это позволит поисковикам понять, какой сайт для россии, а какой для других регионов и повысит PR.

Худший ответ: а что если сделать частично как WP:
в папке лежит файл локализации ru.lng,  en.lng   при заходе на сайт автоматом определяется язык посетителя и подгружаются значения заголовков, лейблов и т д с соответствующего файла, также есть кнопка для принудительного переключения. 
Не знаю правда насколько  быстро  UI будет отрисовываться
Вопрос: Как сделать блок с кривым border?

Лучший ответ: Нарисовать в svg
jsfiddle.net/QW01_01/sLxhuqjw/1

Худший ответ: Нет, только на CSS не получится. По крайней мере, пока.
Вопрос: mdadm — raid 1 — сделать spare рабочим

Лучший ответ: Если на единственной активной реплике есть ошибки чтения, репликация с неё будет постоянно перезапускаться и обрываться на первой ошибке, а второй диск будет постоянно считаться spare.

Решал именно такую проблему. Мы вычислили адрес сектора, на котором ошибка, принудительно ремапили его с помощью hdparm и тогда репликация завершилась успешно. (Я тут даже вопрос задавал — как hdparm обрабатвает advanced format диски? Оказалось, правильно обрабатывает, зачищает все восемь секторов.)

Худший ответ: mdadm --grow /dev/md127 -n 2 -x 0 пробовали?
Вопрос: Lua — игрушка или полноценный язык?

Лучший ответ: Использую Corona SDK — продукт очень хороший, пользуйтесь — не пожалеете. Много качественных приложений уже сделали.
Продвинутых фич, конечно, не хватает, но они и нужны далеко не всем. Команда активно развивает SDK каждый день, отзывается на багрепорты и фичереквесты. Дружелюбное комьюнити.
Альтернатива Moai SDK.

Худший ответ: Хорошо, но все же советую приобщиться к этому каналу, мне он очень сильно помог быстро освоится с SDK, да и в курсе последних тенденций будите.
Вопрос: Как привязаться (binding) к перечислению (enum), исключив ненужные элементы?

Лучший ответ: думаю можно сформировать нужный список значений и прибиндить уже его.
1)Enum.GetValues(typeof (T)) - получите все значения из Enum.
2)Enum.GetValues(typeof (T)).Cast()  - получите IEnumerable
3 ) тут с помощью, например, Where() отфильтруйте ненужные значения
4) сформируйте List с помощью ToList()
и его и используйте в ComboBox

Худший ответ: Ответ от Алексей Кулаков @carbon8 подходящий.
Подобное гуглится при запросе "C# wpf bind enum with filter".
Вопрос: Как вы учитесь на работе?

Лучший ответ: Элементарно. Поездка на работу занимает у меня 3 часа. Я превращаю их в 3 часа обучения.

Худший ответ: Можно учиться в свободное от работы время.
Вопрос: Как открыть файл на gitHub?

Лучший ответ: Пожалуйста rkrdo.github.io/2013/10/04/github-raw и raw.githack.com

Худший ответ: клонировать репозиторий, собрать проект если нужно и запустить
Вопрос: Можно в golang написать функцию конструктор или наследовать от другой функции?

Лучший ответ: Среди всего интернета элементарного примера так и не нашёл. Спасибо за подсказки, в каком направлении двигаться.
Вот решениеtype logWrapper struct {
        http.Handler
    }

    func (wr logWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
        log.Printf("%s %s %s\n", r.Method, r.URL, time.Now())
        wr.Handler.ServeHTTP(w, r)
    }    

    func main() {

        router := mux.NewRouter()
        s := http.StripPrefix("/static/", http.FileServer(http.Dir("./files/"))) 
        router.HandleFunc("/", Index)
        router.HandleFunc("/login", LogIn)
        router.HandleFunc("/logout", LogOut)   
            FileHandler := http.HandlerFunc(File) 

        router.Handle("/file.html", logWrapper{FileHandler})
        router.PathPrefix("/static/").Handler(s)
        http.Handle("/", router) 

        http.ListenAndServe(":5000", nil) 
    } 

    func Index(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "hello")
    }

    func File(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "это обрабатывается в обёртке)) ")
    }
    ....

Худший ответ: Откройте для себя middleware, например interpose. Вот пример с авторизацией, все чисто и ваши функции не затрагивает
Вопрос: Какие есть отличные уроки по Python?

Лучший ответ: Есть отличный Марк Лутц! Он вас всему и научит.

Худший ответ: Не знаю подойдет ли Вам мой путь развития. Опишу свой путь изучения Python-а, т.е. ту "дорожку" по которой прошел сам.
У меня были задачи разного характера:
* Поискать в логах тестируемого приложения значения одного типа и принять решение, ошибка сборки или нет
* Обновить версию приложения в исходном код на основе входного json-файла содержащую параметры новой версии
* Скачать исходники из Mercurial из текущей ревизии, Собрать приложение, Запустить тестовое приложение и если обнаружена ошибка, то откатиться до предыдущего тега по формату ver__ и повторить снова. После обнаружения тега на котором ошибки нет напечатать это в логе
Любой язык программирования учится значительно быстрее, если Вы решаете не "ханойские башни", а непосредственно свои проблемы или проблемы команды с которой пилите проблемы.
Уверяю Вас: задача + справочник Д.Бизли + Stackoverflow = то что Вам нужно!
Вопрос: Какую программу использовать для дорисовки заборов и пристройки домов?

Лучший ответ: Любой графический редактор.

Худший ответ: Если подразумевается, что фотографии будут меняться от клиента к клиенту, то для более менее реалистичного или хотя бы нормального результата нужна связка из 2D и 3D-графических редакторов (Blender+Gimp, например).
В противном же случае можно просто  обойтись графическим редактором, но результат (особенно если этот чел "яжнепрограммсит" и "яжнедезингер") будут напоминать детскую аппликацию.
Вопрос: Как реализовать собственную аутентификацию\авторизацию для сайта?

Лучший ответ: Основных проблемы две:
1. Как генерируется токен, хранится и удаляется. Есть ли привязка к IP и др.
2. Угон токена через xss или другим способом, поскольку можно напрямую его читать. Наиболее рациональным подходом будет хранить в куки с флагом httponly. Для параноидальности еще можно разбить токен на две части. Одна в куке, другая отправляется вручную в запросе/заголовке.
Но еще лучше использовать http digest аутентификацию.

Худший ответ: Элементарно
Вопрос: Возможно ли инициировать в браузере «сохранить изображение как»?

Лучший ответ:  можно было.
Еще поищите jQuery file download

Худший ответ: Пример для php
php.net/manual/en/function.readfile.php#refsect1-f... (под все браузеры)
Для некоторых браузеров также можно использовать атрибут download в ссылке
www.w3schools.com/tags/att_a_download.asp
Поддержка caniuse.com/#feat=download