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

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

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

2
задан 27 March 2019 в 11:29
1 ответ
 Параметры + Индексы + Включает + 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 выполнит поиск соответствующего ресурса ( файлов. * - по сути, пробует различные расширения файлов), пока не будет найден ответ с ожидаемым mime-типом. «Проблема» в том, что это происходит в самом начале запроса, поэтому часто возникает конфликт с mod_rewrite.

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

3
ответ дан 3 December 2019 в 10:32

Теги

Похожие вопросы