Назад | Перейти на главную страницу

Apache, похоже, игнорирует мой файл .htaccess, несмотря на то, что mod_rewrite включен и AllowOveride все

Технические характеристики системы:

Вот мои VirtualHosts:

<VirtualHost *:80>
    DocumentRoot "/var/www/sub.mysite.com/app/public"
    ServerName sub.mysite.com

    <Directory "/var/www/sub.mysite.com/app/public">
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    DocumentRoot "/var/www/sub.mysite.com/app/public"
    ServerName sub.mysite.com

    SSLEngine on
    SSLCertificateFile /ssl/mykey.crt
    SSLCertificateKeyFile /ssl/mykey.key
    <Directory "/var/www/sub.mysite.com/app/public">
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
    </Directory>
</VirtualHost>

И .htaccess, который находится в этом общедоступном каталоге:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

Это приложение Laravel (PHP), что означает, что упомянутый выше «общедоступный» каталог для DocumentRoot для моего VirtualHost содержит скрипт index.php, который является точкой входа в приложение, и файл .htaccess, который отправляет все запросы к этому скрипту.

Я подтвердил, что mod_rewrite включен как через apachectl -D DUMP_MODULES и phpinfo. Как видно выше AllowOverride All установлен. Разрешения для файла также кажутся правильными - если я использую этот сценарий в / public, я получаю ожидаемые результаты (.htaccess существует и доступен для чтения веб-сервером).

Однако, насколько я могу судить, .htaccess игнорируется. Например: если я сделаю запрос https://sub.mysite.com/admin/login, Apache, похоже, ищет этот путь как явный файл (когда он обычно помещается в index.php) - отрывок из глобального apache error_log:

AH00128: File does not exist: /var/www/sub.mysite.com/app/public/admin/login

Если я создам произвольный сценарий PHP в этом общедоступном каталоге и перейду к нему напрямую, этот сценарий будет работать должным образом.

Что бы это ни стоило, я не думаю, что это проблема Cloudflare - если я жестко закодирую фактический IP-адрес сервера в моем хост-файле с доменом, я получу такое же точное поведение, и я могу подтвердить, что браузер переходит непосредственно на сервер в этом сценарии и не проходит через облачную вспышку.

Итак, запись Cloudflare DNS A работает - добираюсь до сервера. Кажется, что VHosts работает, поскольку apache ищет файлы в правильном корне документа. Это как если бы apache игнорировал файл .htaccess в этом каталоге, который должен принимать что-нибудь в пути URL-адреса и передайте его скрипту index.php.

Как я могу узнать, знает ли apache о .htaccess, не говоря уже о его анализе?

Изменить: по предложениям в комментариях я попытался добавить какой-то мусор в файл .htaccess, чтобы узнать, кашляет ли apache страницу с ошибкой - не повезло. Такое же поведение. В качестве элемента управления я попробовал это на другом (рабочем) сервере и увидел обычную страницу ошибок Apache с жалобами на неправильную конфигурацию. Это говорит мне о том, что apache либо не видит, либо намеренно игнорирует мой .htaccess.