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

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

  • Amazon Linux AMI выпуск 2017.03

  • Apache / 2.4.33 (Amazon)

  • PHP 5.6.36

  • DNS обрабатывается Cloudflare

Вот мои виртуальные хосты:

<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.

0 ответов

Другие вопросы по тегам