我在 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
放置在文档根目录(我假设您将它放在那里)中的任何文件都不会被处理。