Apache2 mod_rewrite は何もしていないようだ

Apache2 mod_rewrite は何もしていないようだ

Debian 10のApache2でmod_rewriteを動作させるのに苦労しています。

a2enmod rewrite
systemctl restart apache2

そしてエラーは発生せず、モジュールは

apachectl -M
...
rewrite_module (shared)
...

私がそれをサイト利用可能な仮想ホストに追加すると

<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>

URLを書き換えることを期待してhttp://192.168.20.87/page.phpブラウザタブでhttp://nothing/page.phpとして表示します。RewriteRuleに何を入力しても何も起きません。何かやっていることは確かです

答え1

RewriteEngine on
RewriteRule ^192.168.20.87$ nothing

何らかの理由で.htaccessで実行すると動作します

http://192.168.20.87/page.phpこれは「」で実行してもURLと一致しないので.htaccess何か他のことをする?

上記のルールは (<Directory>コンテナー内で使用される場合) 形式の URL http://192.168.20.87/192.168.20.87(またはhttp://default.nothing/192.168.20.87ホスト名が解決される場合は - ) と一致します。

RewriteRule パターンURLパスのみに一致し、ホスト名には一致しません(つまり、192.168.20.87)。したがって、これは/page.php、 (またはpage.php相対パス/スラッシュプレフィックスなし)に一致します。ディレクトリ<Directory>またはのようなコンテキスト.htaccess

したがって、代わりに次のようになります。

RewriteRule ^page\.php$ nothing

(ここで何をしようとしているのかは不明ですが、「何もしない」とはどういうことでしょうか? 404 をトリガーしようとしているのであれば、これは実際には適切な方法ではありません。)

@Gerritがコメントで大まかに言及したように、このRewriteRuleディレクティブがサーバまたは仮想ホストコンテキスト(つまり、コンテナ内では<Directory>ない.htaccessディレクトリRewriteRuleコンテキストの場合、ディレクティブがファイル システムにマップされる前に、かなり早い段階で処理されるため、ディレクティブに一致する URL パスはスラッシュで始まるルート相対になります。例: ^/page\.php$.


アップデート:

DocumentRoot /var/www/html/public_html/00-default
<Directory "/volume/dev/html/public_html/00-default">

DocumentRootディレクティブとディレクティブが 2 つの異なるファイルシステムの場所を参照していることに気付きました<Directory>。質問の情報が限られているため、この<Directory>コンテナーは処理されません。

しかし、他の場所に追加のディレクティブがない限り (必ずあるはずです)、.htaccessドキュメント ルート (ファイルを置く場所だと思います) に配置されたファイルも処理されることはありません。

関連情報