Granting write permissions to www-data group

For example, on one host, the setup is like this:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs'

The real document roots are:

test.example.com -> /data/htdocs/example.com/test
www.example.com -> /data/htdocs/example.com/www

And I’d like a script that’s run from www.example.com/blog/ (on the path /data/htdocs/example.com/www/blog) to get the correct value of /data/htdocs/example.com/www.

On another host, the setup is a bit different:

$_SERVER['DOCUMENT_ROOT'] == '/srv'
test.example.com -> /home/virtual_web/example.com/public_html/test
www.example.com -> /home/virtual_web/example.com/public_html/www

My remote server is a Debian 2.6.26-1-686 #1 SMP Fri Mar 13 18:08:45 UTC 2009 i686
Is far away and I just work in remote.

asked May 31, 2017 at 21:54

user1099798's user avatar

  1. Write a shell script that will make the changes you want.
  2. FTP in to your server and upload the script somewhere where it will be run as root. Options I’ve used in the past have included startup scripts and /etc/cron.hourly/.
  3. If needed, do something to trigger the script you’ve uploaded.
  4. If needed, reboot the server or otherwise cause your changes to be applied.

answered Jun 9, 2017 at 7:28

Mark's user avatar

1 gold badge13 silver badges19 bronze badges

You’re not going to fix your sshd_config as www-data. If you don’t have remote console access then you’ll need to speak to someone with physical access or make a trip.

Next time test out your config changes on a local machine.

answered May 31, 2017 at 23:22

symcbean's user avatar

1 silver badge9 bronze badges

sudo usermod -aG www-data iain
addgroup www-data

Second, you don’t want apache to have full rw access to /var/www: this is potentially a major security breach. As a general rule, allow only what you need, and nothing more (principle of least privilege). In this case, you need apache (www-data) and you (www-data group) to write (and read) in /var/www/example.com/public_html, so

sudo chown -R www-data:www-data /var/www/example.com/public_html
sudo chmod -R 770 /var/www/example.com/public_html

Edit: to answer your original question, yes, any member of www-data can now read and execute /var/www (because the last bit of your permissions is 5 = read + exec). But because you haven’t used the -R switch, that applies only to /var/www, and not to the files and sub-directories it contains. Now, whether they can write is another matter, and depends on the group of /var/www, which you haven’t set. I guess it is typically root:root, so no, they (probably) can’t write.

Дополнительно:  Как исправить BSoD 0x00000139 на Windows 7, 8.1 и 10?

Edit on 2014-06-22: added a note that -aG option is valid on Debian-based servers. It apparently varies with the distribution, so read man carefully before executing.

Just to confirm, is using:

$_SERVER["DOCUMENT_ROOT"]

the same as using: /

Eg. If current document is:

folder/folder/folder/index.php

I could use (in HTML) to start at the roort:

/somedoc.html

and to do the same in PHP I would have to use:

$_SERVER["DOCUMENT_ROOT"] . "/somedoc.html";

Is that correct? Is there an easier way to do it?

asked Aug 13, 2012 at 3:45

Andrew's user avatar

<a data-hren="<?php echo $_SERVER['DOCUMENT_ROOT'].'/hello.html'; ?>">go with php</a>
    <br />
<a data-hren="/hello.html">go to with html</a>

Try this yourself and find that they are not exactly the same.

HTML’s / renders the root of the server url, in my case, localhost/

But C:/wamp/www/hello.html and localhost/hello.html are in fact the same file

answered Aug 13, 2012 at 4:00

khaverim's user avatar

5 gold badges36 silver badges47 bronze badges

Just / refers to the root of your website from the public html folder. DOCUMENT_ROOT refers to the local path to the folder on the server that contains your website.

If you want to give the absolute path to a file on your server (from the server’s root) you can use DOCUMENT_ROOT. if you want to give the absolute path to a file from your website’s root, use just /.

answered Aug 13, 2012 at 4:01

sachleen's user avatar

8 gold badges77 silver badges73 bronze badges

Martin's user avatar

10 gold badges68 silver badges131 bronze badges

answered Nov 11, 2018 at 7:33

timeSmith's user avatar

1 gold badge8 silver badges16 bronze badges

The Easiest way to do it is to have good site structure and write it as a constant.

DEFINE("BACK_ROOT","/var/www/");

answered Aug 13, 2012 at 4:09

Adam Fowler's user avatar

Adam Fowler

1 gold badge17 silver badges18 bronze badges

Определение виртуального сервера по имени

nginx вначале решает, какой из серверов должен обработать запрос.
Рассмотрим простую конфигурацию,
где все три виртуальных сервера слушают на порту *:80:

Дополнительно:  Mysql server пароль root по умолчанию

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

В этой конфигурации, чтобы определить, какому серверу следует направить
запрос, nginx проверяет только поле “Host” заголовка запроса.
Если его значение не соответствует ни одному из имён серверов
или в заголовке запроса нет этого поля вовсе,
nginx направит запрос в сервер по умолчанию для этого порта.
В вышеприведённой конфигурации сервером по умолчанию будет первый сервер,
что соответствует стандартному поведению nginx по умолчанию.
Сервер по умолчанию можно задать явно с помощью параметра
default_server в директиве
listen:

server {
    listen      80 default_server;
    server_name example.net www.example.net;
    ...
}

Параметр default_server появился в
версии 0.8.21.
В более ранних версиях вместо него следует использовать параметр
default.

Следует иметь в виду, что сервер по умолчанию является свойством
слушающего порта, а не имени сервера.
Подробнее это обсуждается ниже.

Как предотвратить обработку запросов без имени сервера

Если запросы без поля “Host” в заголовке не должны
обрабатываться, можно определить сервер, который будет их отклонять:

server {
    listen      80;
    server_name "";
    return      444;
}

Здесь в качестве имени сервера указана пустая строка, которая
соответствует запросам без поля “Host” в заголовке,
и возвращается специальный для nginx код 444, который закрывает
соединение.

Начиная с версии 0.8.48 настройка server_name ""
является стандартной и может явно не указываться.
В более ранних версиях в качестве стандартного имени сервера
выступало имя машины (hostname).

Определение виртуального сервера по имени и IP-адресу

Рассмотрим более сложную конфигурацию,
в которой некоторые виртуальные серверы слушают на разных адресах:

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80;
    server_name example.com www.example.com;
    ...
}

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

server {
    listen      192.168.1.1:80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      192.168.1.1:80 default_server;
    server_name example.net www.example.net;
    ...
}

server {
    listen      192.168.1.2:80 default_server;
    server_name example.com www.example.com;
    ...
}

Конфигурация простого сайта PHP

Теперь посмотрим на то, как nginx выбирает location
для обработки запроса на примере обычного простого PHP-сайта:

server {
    listen      80;
    server_name example.org www.example.org;
    root        /data/www;

    location / {
        index   index.html index.php;
    }

    location ~* \.(gif|jpg|png)$ {
        expires 30d;
    }

    location ~ \.php$ {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME
                      $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}

nginx вначале ищет среди всех префиксных location’ов, заданных строками,
максимально совпадающий.
В вышеприведённой конфигурации
указан только один префиксный location “/”, и поскольку
он подходит под любой запрос, он и будет использован, если других
совпадений не будет найдено.
Затем nginx проверяет location’ы, заданные регулярными выражениями, в
порядке их следования в конфигурационном файле.
При первом же совпадении поиск прекращается и nginx использует
совпавший location.
Если запросу не соответствует ни одно из регулярных выражений,
nginx использует максимально совпавший префиксный location,
найденный ранее.

Дополнительно:  Description

Следует иметь в виду, что location’ы всех типов сопоставляются только с
URI-частью строки запроса без аргументов.
Так делается потому, что аргументы в строке запроса могут быть
заданы различными способами, например:

/index.php?user=john&page=1
/index.php?page=1&user=john

Кроме того, в строке запроса можно запросить что угодно:

/index.php?page=1&something+else&user=john

Теперь посмотрим, как бы обрабатывались запросы
в вышеприведённой конфигурации:

  • Запросу “/logo.gif” во-первых соответствует префиксный
    location “/”, а во-вторых — регулярное выражение
    \.(gif|jpg|png)$”,
    поэтому он обрабатывается location’ом регулярного выражения.
    Согласно директиве “root /data/www” запрос
    отображается в файл /data/www/logo.gif, который
    и посылается клиенту.
  • Запросу “/index.php” также во-первых соответствует префиксный
    location “/”, а во-вторых — регулярное выражение
    \.(php)$”.
    Следовательно, он обрабатывается location’ом регулярного выражения
    и запрос передаётся FastCGI-серверу, слушающему на localhost:9000.
    Директива
    fastcgi_param
    устанавливает FastCGI-параметр
    SCRIPT_FILENAME в “/data/www/index.php”,
    и сервер FastCGI выполняет указанный файл.
    Переменная $document_root равна
    значению директивы
    root,
    а переменная $fastcgi_script_name равна
    URI запроса, т.е. “/index.php”.
  • Запросу “/about.html” соответствует только префиксный
    location “/”, поэтому запрос обрабатывается в нём.
    Согласно директиве “root /data/www” запрос
    отображается в файл /data/www/about.html, который
    и посылается клиенту.
  • Обработка запроса “/” более сложная.
    Ему соответствует только префиксный location “/”,
    поэтому запрос обрабатывается в нём.
    Затем директива
    index
    проверяет существование индексных файлов согласно своих параметров
    и директиве “root /data/www”.
    Если файл /data/www/index.html не существует,
    а файл /data/www/index.php существует, то
    директива делает внутреннее перенаправление на “/index.php
    и nginx снова сопоставляет его с location’ами,
    как если бы такой запрос был послан клиентом.
    Как мы видели ранее, перенаправленный запрос будет в конечном итоге
    обработан сервером FastCGI.
Оцените статью
Master Hi-technology
Добавить комментарий