Разрешено ли PHP изменять .htaccess файл в текущей папке? - PullRequest
3 голосов
/ 19 февраля 2009

У меня есть веб-приложение PHP, расположенное на виртуальном хостинге . Моя цель - изменить файл .htaccess из кода PHP, когда страница PHP запущена. Мне нужен этот .htaccess, чтобы вставить в него пару строк mod_rewrite.

Проблема в том, что в Windows + Apache я могу динамически изменять файл .htaccess. но тот же код в Linux сообщает о проблеме, когда я пытаюсь получить доступ к этому файлу в любом путь (копировать или открыть):

"failed to open stream: Permission denied"

Я дал файлу .htaccess 777 разрешений - все равно безрезультатно. Что мешает мне сделать это? Как я могу разработать обходной путь?

P.S. Моя первоначальная цель состояла в том, чтобы иметь возможность добавить новый RewriteRule в .htaccess, который отображает недавно добавленный category_id с новым category_name.

Если бы это не был общий хостинг, я бы использовал что-то вроде RewriteMap (в основной конфигурации Apache) и смог бы получить доступ к файлу карты.

Это первое реальное ограничение, с которым я не смог справиться с помощью PHP + Apache, но я надеюсь, что оно также пригодно для работы с системой.

Ответы [ 5 ]

7 голосов
/ 19 февраля 2009

Это кажется слишком сложным решением - просто иметь общую страницу «загрузки категории», которая берет имя категории из URL и загружает соответствующий идентификатор.

Например, если URL-адрес:

http://yoursite.com/category/programming

Я бы переназначил это что-то вроде:

http://yoursite.com/category.php?name=programming
5 голосов
/ 20 февраля 2009

Я хочу предложить что-то еще, что также работает. Вместо написания правила для каждого «специального» 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>

Благодаря этому чанку у вас есть система, которая в некоторой степени неограничена. Если вы когда-нибудь захотите переименовать ваш категорический URL или добавить еще один особый случай, он уже готов!

3 голосов
/ 20 февраля 2009

Хотя я согласен с приведенными выше комментариями, это определенно можно сделать. PHP-приложения, такие как WordPress, делают именно это на основе изменений, внесенных на странице настроек. Это должно быть так же просто, как записать файл, однако родительский каталог НУЖЕН иметь разрешение на запись в него пользователю веб-сервера.

Если это не работает для вас, трюк будет в том, чтобы сделать родительский каталог 777 или 775 и установить для группы группу, под которой работает Apache (обычно «apache» или «www» или что-то подобное)

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

3 голосов
/ 19 февраля 2009

Вам нужен только небольшой набор правил переписывания. Чтобы сделать то, что предлагает Чад:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/category/.*$ category.php [QSA]

Таким образом, каждый раз, когда кто-то переходит на /category/category_id, запрос будет направлен на category.php, которому будет передан /category/ URI в $_SERVER['REQUEST_URI'], из которого вы можете легко получить идентификатор категории, и вы не нужно редактировать файл .htaccess при каждом добавлении категории.

1 голос
/ 19 февраля 2009

Я согласен с Чедом Бёрчем. Однако, если вас не могут отговорить, в вашей ситуации я бы сначала искал родительские каталоги с заблокированными разрешениями.

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

...