У меня возникли трудности с работой mod_rewrite в Apache2 на Debian 10. Я включил расширение с помощью
a2enmod rewrite
systemctl restart apache2
И не было никаких ошибок и я могу видеть модуль в
apachectl -M
...
rewrite_module (shared)
...
Хотя когда я добавляю его в свой vhost в sites-available
<VirtualHost *:80>
ServerName default.nothing
ServerAlias www.default.nothing
DocumentRoot /var/www/html/public_html/00-default
<Directory "/volume/dev/html/public_html/00-default">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
RewriteEngine on
RewriteRule ^192.168.20.87$ nothing
</Directory>
<IfModule mpm_user_module>
ServerEnvironment apache apache
</IfModule>
</VirtualHost>
Надеясь, что это перепишет URLhttp://192.168.20.87/page.phpкак http://nothing/page.php во вкладке браузера. Что бы я ни ввел в RewriteRule, ничего не происходит. Я уверен, что я что-то делаю
решение1
RewriteEngine on RewriteRule ^192.168.20.87$ nothing
По какой-то причине, если я делаю это с помощью .htaccess, то это работает.
Хотя это не будет соответствовать URL, http://192.168.20.87/page.php
даже если вы «сделаете это с помощью .htaccess
», поэтому вы должны бытьделать что-то еще?
Вышеуказанное правило (при использовании в <Directory>
контейнере) соответствует URL-адресу формы http://192.168.20.87/192.168.20.87
(или http://default.nothing/192.168.20.87
- если разрешаются ваши имена хостов).
TheRewriteRule
шаблонсоответствует только URL-пути, а не имени хоста (т.е. 192.168.20.87
). Таким образом, это соответствует /page.php
, (или page.php
- относительный путь/без префикса слеша - при использовании вкаталогконтекст как <Directory>
или .htaccess
.)
Поэтому это должно быть похоже на следующее:
RewriteRule ^page\.php$ nothing
(Хотя непонятно, что вы пытаетесь здесь сделать, что значит «ничего»? Если вы пытаетесь вызвать ошибку 404, то это не совсем тот способ, которым следует это делать.)
Как @Gerrit небрежно упомянул в комментариях, когда RewriteRule
директива используется всервериливиртуальныйхостконтекст (т.е. не в <Directory>
или .htaccess
контейнеры -каталогcontext), то URL-путь, соответствующий RewriteRule
директиве, является корневым и начинается со слеша, поскольку директива обрабатывается гораздо раньше, до того, как она будет сопоставлена с файловой системой. Например, ^/page\.php$
.
ОБНОВЛЯТЬ:
DocumentRoot /var/www/html/public_html/00-default <Directory "/volume/dev/html/public_html/00-default">
Я только что заметил, что ваши директивы DocumentRoot
и <Directory>
ссылаются на два разных расположения файловой системы?! При ограниченной информации в вопросе этот <Directory>
контейнер никогда не будет обработан.
Но если у вас нет дополнительных директив где-либо еще (а я предполагаю, что они у вас должны быть), то любой .htaccess
файл, помещенный в корневой каталог документов (куда, как я предполагаю, вы его и помещаете), никогда не будет обработан.