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

.htaccess RewriteRule не работает

У меня есть среда Windows с использованием WAMP, где это отлично работает. Я просто настраиваю среду разработки рабочего стола Ubuntu, и этот конкретный mod_rewrite не работает.

Это довольно просто, но если я пойду
example.local/files/a-real-file.pdf Я получаю 404 not found из апача. Если я пойду в
example.local/files.php/a-real-file.pdf файл будет отображаться, как и ожидалось. Если я пойду в
example.local/files.php/non-existing-file.who.cares Я получаю var_dump($thelink) как и ожидалось от моего files.php логика.

в .htaccess в моем веб-корне

RewriteEngine On
RewriteRule ^files/(.*)$ files.php/$1

моя конфигурация apache vhost

<VirtualHost *:80>
    ServerName reqapp.localhost
    DocumentRoot /var/www/html/aaApp/public_html
    <Directory /var/www/html/aaApp/public_html/>
        Options +Indexes +Includes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

и для хорошей оценки "localhost" conf

<VirtualHost *:80>
    ServerName localhost
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

а также «применимая» часть apache2.conf

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>

<Directory /usr/share>
    AllowOverride None
    Require all granted
</Directory>

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

в соответствии с phpinfo() mod_rewrite загружен. Если создать синтаксическую ошибку в .htaccess файл, сайт вылетает.

Не знаю, где еще искать. Я не могу штрафовать другого .conf файлы в файлах "{mods | conf | sites} -enabled", которые должны работать в этом каталоге.

Возможно, стоит упомянуть, что у меня также работает экземпляр Joomla, и SEF отлично с ним работает.

Options +Indexes +Includes +FollowSymLinks +MultiViews

Вам нужно отключить MultiViews (или просто не включать это). Например:

Options +Indexes +Includes +FollowSymLinks -MultiViews

Или вообще убрать из Options директива, если она еще не включена на сервере.

С участием MultiViews включено, mod_negotiation вызовет внутренний подзапрос для files.php (без дополнительных информация о пути что необходимо для успешного выполнения вашего запроса) перед mod_rewrite проверяет запрос. Так что RewriteRule шаблон никогда не совпадает и перезапись не происходит.

ОБНОВИТЬ: MultiViews является частью mod_negotiation (согласование содержимого). Проблема в вашем случае в том, что вы запрашиваете /files/... (в допустимом каталоге - корне документа) и файл с этим базовым именем существует в этом каталоге. Если бы вы попросили /bar/... (который предположительно не существует) или переписать на /another.php/... тогда вы бы не столкнулись с этой проблемой.

Когда вы просили /files/..., MultiViews приводит к Apache поиск для соответствующего ресурса (files.* - по сути, пробуя различные расширения файлов), пока не будет найден ответ с ожидаемым mime-типом. «Проблема» в том, что это происходит очень рано в запросе, поэтому часто конфликтует с mod_rewrite.

Это простой способ включения URL-адресов без расширений (переписывание URL-адресов не требуется). Однако, как только вам нужно сделать что-то более сложное, это, скорее всего, будет конфликтовать с mod_rewrite - распространенная проблема. MultiViews не включен в Apache по умолчанию (однако некоторые общий хосты действительно включают его).