Как настроить прямой доступ к php файлу в .htaccess?
Добрый день
Перенёс свой локальный Wordpress-сайт на внешний хостинг, всё вроде бы работает хорошо, но не могу напрямую открыть свои кастомные скрипты в браузере которые складывал в каталог /custom относительно корня сайта
При попытке открыть любой из таких скриптов по условному адресу https://site.com/custom/test.php получаю 404-ю ошибку темы Вордпресса.
Пара моментов:
- Если убрать .htaccess - скрипты по вышеуказанному адресу начинают открываться корректно
- если переложить /custom/test.php в корень сайта, то он корректно открывается по адресу https://site.com/test.php
Доступов к редактированию конфига Apache нет, т.к. это обычный хостинг, а не VPS. Хотя, как я понимаю, проблема именно в настройках сервера.
Содержимое .htaccess стандартное от Wordpress:
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress |
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Подскажите, пожалуйста, как можно перенастроить .htaccess на запуск скриптов в браузере из подкаталога?
Дополнительно:
Внутри /custom создай пустой файл .htaccessи впиши в него RewriteEngine Off
.htaccess — это дополнительный конфигурационный файл Apache, который позволяет настраивать работу веб-сервера для каждой отдельной директории, не влияя на глобальные настройки Apache.
- Хочу добавить. Странно, но мои кастомнык скрипты работают без доп.настройки. только в корне вордпрессовский htaccess находится и все
- maksam07,
Файл .htaccess, расположенный в корневой папке сайта, имеет самый низкий приоритет. Его настройки перезаписываются файлами .htaccess из вложенных папок.
Например, если в корневой папке есть файл .htaccess с запретом индексации папок, а во вложенной папке articles есть файл .htaccess с разрешением индексации, то для папки articles будет действовать разрешение индексации.
- zkrvndm Спасибо за ответ, похоже, это нужное направление!
У меня просто в этой custom директории уже был .htaccess со следующим содержимым:
AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
Если добавляю указанную строку и получаю:
RewriteEngine Off AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
RewriteEngine Off AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
То по-прежнему 404-я ошибка
Но если удаляю всё и оставляю только:
RewriteEngine Off
То всё работает и скрипт открывается.
Есть ли какая-то возможность объединить моё предыдущее содержимое с этой директивой RewriteEngine Off?
- а там точно 404 а не 403
- BarneyGumble, проверьте расположение файла .htpasswd. Согласно настройкам браузер не должно пускать в эту директорию без запроса пользователя/пароля. Пароль запрашивало? Если нет - что-то не так с файлом паролей...
- BarneyGumble, просто не используй Basic Auth. Зачем тебе авторизация по паролю с использованием этой кривой технологии, когда можно просто предусмотреть в PHP скрипте GET параметр с секретом?
А если все таки нужен Basic Auth, ну попробуй его на стороне PHP руками сделать:
https://vk-book.ru/primer-basic-authentication-s-p... - zkrvndm однако хотелось бы оставить текущую реализацию, файлов внутри custom очень много
- AUser0 файл на месте, повторюсь, если .htaccess из корня убрать, то и логин-пароль корректно запрашиваются и сам кастомный скрипт при успешной авторизации запускается
- BarneyGumble, в таком случае затрудняюсь ответить в чем именно может быть проблема, я не знаток .htaccess увы, что-то знаю по верхам, но не более.
- BarneyGumble, а там вложенных папок внутри еще нет? Правило внутри самой глубокой папки имеет самый наивысший приоритет, если что.
- zkrvndm, но это правило не распространяется на вышестоящую директорию.
BarneyGumble, а в корневом .htaccess случаем не установлено опции AllowOverride None? А при нормальных .htaccess в корневой и в /custom/ пароль запрашивается? А может в настройках Apache для директории /custom/ прописаны персональные настройки?
При Basic Auth вначале сервер отвечает клиенту статусом 401.
Браузер отображает страницу с запросом логина/пароля.
Как вместо 401 получается 404 от Wordpress?
Если в настройках Apache с помощью ErrorDocument для 401 указан какой-то путь, то происходит внутреннее перенаправление на этот адрес и весь список правил mod_rewrite выполняется заново.
Если файл не найден запрос отправляется в index.php и Wordpress меняет статуc на 404.
Можно в файле /.htaccess или /custom/.htaccess указать для 401 какой-нибудь существующий файл.
Тогда запрос не будет попадать в Wordpress.
ErrorDocument 401 /file.html
Если указать не путь к файлу, а какой-то текст.
ErrorDocument 401 " Some text "
То не будет выполнения правил mod_rewrite и запрос не попадёт в Wordpress.
Ну ещё вариант специальное значение default восстановит значение по умолчанию.
ErrorDocument 401 default
Другой вариант добавить в файл /.htaccess исключение для запросов со статусом 401 и пустить их в обход правил Wordpress.
RewriteCond %{ENV:REDIRECT_STATUS} =401 RewriteRule ^ - [L] |
RewriteCond %{ENV:REDIRECT_STATUS} =401 RewriteRule ^ - [L]
Ставить выше правил правил Wordpress.
- dodo512 Спасибо за подробное объяснение! Действительно, так работает, если в файле /custom/.htaccess оставить следующее содержимое:
ErrorDocument 401 default RewriteEngine Off AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
ErrorDocument 401 default RewriteEngine Off AuthType Basic AuthName "Restricted area. For personnel only" AuthUserfile "/home/project/www/custom/.htpasswd" Require valid-user
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В стандартном
.htaccessWordPress правилоRewriteCond %{REQUEST_FILENAME} !-fдолжно пропускать реальные файлы. Если/custom/test.phpуходит в 404 темы, значит Apache по какой-то причине не видит этот путь как существующий файл или до стандартного блока WordPress срабатывает другое правило.Минимальный вариант: добавьте исключение для каталога
customвыше блока WordPress.# Custom PHP scripts <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^custom/ - [L] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress# Custom PHP scripts <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^custom/ - [L] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
Но лучше не держать произвольные PHP-скрипты в публичной папке WordPress. Если скрипт относится к сайту, оформите его как endpoint, shortcode, REST route или отдельный плагин. Например REST route:
add_action('rest_api_init', function () { register_rest_route('custom/v1', '/test', [ 'methods' => 'GET', 'callback' => function () { return ['ok' => true]; }, 'permission_callback' => '__return_true', ]); });
Прямой доступ к PHP-файлам повышает риск: такие файлы часто обходят авторизацию, nonce, загрузку окружения WordPress и проверки прав. Если оставляете
/custom, ограничьте доступ, проверьте права и не кладите туда служебные скрипты с действиями записи.Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.
Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.