У меня есть веб-приложение PHP, расположенное на общем хостинге . Моя цель – изменить файл .htaccess из PHP-кода при запуске страницы PHP. Мне нужен этот .htaccess, чтобы вставить в него пару строк mod_rewrite.
Проблема в том, что в Windows + Apache я могу динамически модифицировать файл .htaccess, но тот же код в Linux сообщает о проблеме, когда я пытаюсь каким-либо образом получить доступ к этому файлу (скопируйте или fopen):
"failed to open stream: Permission denied"
Я дал .htaccess файл 777 разрешений – по-прежнему нет результата. Что мешает мне это делать? Как я могу разработать обходное решение?
PS Моя первоначальная цель состояла в том, чтобы добавить новый RewriteRule в .htaccess, который отображает новую добавленную категорию с новым именем категории.
Если бы это был не общий хостинг, я бы использовал что-то вроде RewriteMap (в основной конфигурации Apache) и мог бы получить доступ к файлу карты.
Это первое реальное ограничение, с которым я не смог справиться с PHP + Apache, но я надеюсь, что это тоже возможно.
Я хочу предложить что-то другое, что тоже работает. Вместо того, чтобы писать правило для каждого «специального» URL-адреса, почему бы не использовать его для всех?
Мне было намного проще использовать то, что использует WordPress: каждый URL перенаправляется на индекс.
Все, что вам нужно сделать, это настроить индексный файл, прочитать в загруженном каталоге (возможно, используя $ _SERVER ['URI_REQUEST']) и справиться с ним.
добавьте в .htaccess:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Благодаря этому chunck у вас есть система, несколько неограниченная в вашем распоряжении. Если вам когда-либо захочется переименовать ваш URL-адрес или добавить другой специальный случай, он уже готов!
Это похоже на чрезмерно сложное решение только с общей страницей категории «загрузка», которая берет имя категории из URL-адреса и загружает соответствующий идентификатор.
Например, если URL-адрес:
http://yoursite.com/category/programming
Я бы переделал это на что-то вроде:
http://yoursite.com/category.php?name=programming
Вам нужен только небольшой набор правил перезаписи. Чтобы сделать то, что предлагает Чад:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/category/.*$ category.php [QSA]
Таким образом, в любое время, когда кто-то переходит в /category/category_id
, запрос будет перенаправлен в category.php
, который будет передан /category/
URI в $_SERVER['REQUEST_URI']
, из которого вы можете легко получить идентификатор категории и вам не нужно беспокоиться об изменении файла .htaccess каждый раз, когда вы добавляете категорию.
Хотя я согласен с вышеуказанными комментариями, это определенно можно сделать. Такие PHP-приложения, как WordPress, делают именно это на основе изменений, внесенных на странице настроек. Это должно быть так же просто, как записать файл, однако родительский каталог NEEDS должен иметь разрешение для пользователя веб-сервера писать на него.
Если он не работает для вас, трюк будет делать родительский каталог 777 или 775 и иметь группу, установленную для любой группы Apache, которая работает под (обычно «apache» или «www» или что-то подобное)
Адам (прокомментировал ваш вопрос) вполне корректен, хотя некоторые другие уровни безопасности на вашем сервере могут помешать вам сделать это, и это, вероятно, является хорошим показателем того, что вы можете приблизиться к проблеме неправильно.
Я согласен с Чадом Берчем. В случае, если вы не можете быть отговорены, однако, в вашей ситуации я бы сначала искал родительские каталоги с заблокированными разрешениями.
FYI, одна из причин, по которой переписывание .htaccess – плохая идея, заключается в том, что любые запросы, которые входят в момент перезаписи .htaccess, не будут применены к вашим перенаправленным.