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