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>

希望它能重写 URLhttp://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容器中 - a目录上下文)则指令匹配的 URL 路径RewriteRule是相对于根目录的,以斜杠开头,因为该指令在映射到文件系统之前就被更早地处理。例如^/page\.php$


更新:

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

我刚刚注意到您的DocumentRoot<Directory>指令引用了两个不同的文件系统位置?!由于问题中的信息有限,这个<Directory>容器永远不会被处理。

但是,除非您在其他地方有额外的指令(我认为您必须有),否则.htaccess放置在文档根目录(我假设您将它放在那里)中的任何文件都不会被处理。

相关内容