Как настроить прямой доступ к php файлу в .htaccess?

Ссылка скопирована
1 ответ

Добрый день

Перенёс свой локальный 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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Мария Код Ответ

В стандартном .htaccess WordPress правило 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',
    ]);
});

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.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно