Мой php-скрипт создает каталог пользователя для хранения личных файлов, и мне нужно сохранить его в секрете, кроме владельца.
В основном моя структура такова:
- root/
- storage/
---- users/
----------user1/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file
----------user2/
---------------.htaccess
---------------images/
---------------tmp/
-------------------session-id-file
Это означает, что когда новый пользователь регистрируется, то в / storage / users создается каталог нового пользователя:
$dir = __DIR__ . "/storage/user/" . $user["id"];
mkdir($dir);
Затем внутри создается новый .htaccess:
$myfile = fopen($file, "w") or die("Unable to create file!");
$txt = "RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)\n
**RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1 -f \n**
RewriteRule ^(.+)$ $1 [L]\n
RewriteRule .+ /deny [L]\n";
fwrite($myfile, $txt);
fclose($myfile);
.Htaccess выглядит как:
RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)
RewriteCond {CURRENT-DIRECTORY}/tmp/access-%1 -f
RewriteRule ^(.+)$ $1 [L]
RewriteRule .+ /deny [L]
Когда пользователь входит в систему, новый ID-файл сессии создается в пользовательском каталоге tmp:
touch($dir . "/tmp/" . session_id());
Мой вопрос: как обнаружить {текущий каталог}, где находится htaccess? Как исправить неправильную строку в .htaccess:
RewriteCond {CURRENT-DIRECTORYY}}/tmp/access-%1 -f \n
Я видел подобный вопрос, но я не могу обнаружить текущий каталог на основе каталога, созданного на лету.
Хорошим вариантом может быть использование только одного .htaccess в каталоге / users вместо множества .htaccess для каждого пользователя, как я делал в своем примере.
Спасибо за любое предложение 🙂
Прежде всего, вы можете изменить:
RewriteRule ^(.+)$ $1 [L]
Для того, чтобы:
RewriteRule ^ - [L]
Что означает то же самое. -
можно сказать, что не делайте никаких изменений, просто примените флаги.
Для отрицания, вы можете сделать это правильно, используя [F]
флаг, чтобы вернуть 403 запрещено, вместо 200 переписать в /deny
, Вот так:
RewriteRule ^ - [F,L]
Если вы все еще хотите содержимое /deny
должен быть возвращен, затем добавить ErrorDocument
директива для 403 и указать на этой странице.
Для записи в файл в PHP, вы можете просто использовать file_put_contents
вместо этих трех призывов к fopen
, fwrite
а также fclose
, Увидеть документация.
Чтобы ответить на ваш актуальный вопрос, для текущего каталога вы не можете получить его напрямую из RewriteCond
переменные, но вы можете просто записать его в файл при генерации с помощью PHP.
Вот пример этого с другими предлагаемыми изменениями:
$txt = "RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)\n
RewriteCond $dir/tmp/access-%1 -f\n
RewriteRule ^ - [L]\n
RewriteRule ^ - [F,L]\n";
file_put_contents($myfile, $txt) or die("Unable to create file!");
Так делается, например:
RewriteCond %{HTTP_COOKIE} PHPSESSID=(\w+)
RewriteCond /root/storage/users/userid/tmp/access-%1 -f
RewriteRule ^ - [L]
RewriteRule ^ - [F,L]
Других решений пока нет …