У меня есть среда 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 по умолчанию (однако некоторые общий хосты действительно включают его).