我为在自己的服务器 Apache Ubuntu 22.04 上运行的网站创建了一个 .htaccess 文件,除了重写规则外,其他一切都运行正常。我肯定已经打开了 mod_rewrite,因为当我使用 phpinfo(); 创建 php 文件时,它出现在已加载的模块中。我还进入了 apache.conf 和 sites-enabled conf 文件,并将 AllowOverride 设置为 All。
重定向规则运行正常,没有任何问题,但是每当我尝试使用重写规则时,它似乎总是不起作用。
该代码有效:
Redirect /foobar/ https://example.com
但是此代码没有:
RewriteEngine on
RewriteRule ^foobar/$ https://example.com/ [R]
这是我在 apache2.conf 文件中所做的更改
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Order allow,deny
allow from all
</Directory>
有人知道这是为什么吗,因为我试过的所有方法都不起作用,任何帮助都将不胜感激。
答案1
您的规则可能缺失,并且旁边?
缺少标志可能会导致问题。通常,当从一个目录重定向到另一个目录时,您会执行以下操作:L
R
RewriteEngine On
RewriteRule ^foobar/?$ https://example.com/ [R,L]
但是,如果你重定向到同一个域名,那么通常最好(但不是必须)排除域名。您可以这样做:
RewriteEngine On
RewriteRule ^foobar/?$ / [R,L]
如果你想拥有 Uri 字符串后 foobar/
与主域一起使用,这在您将 Url 方案从类似的更改为时很有用/wordpress/2022/10/05/hello-world
,/2022/10/05/hello-world
然后您可以像这样保留字符串:
RewriteEngine On
RewriteRule ^foobar/(.*)$ /$1 [R=301,NC,L]
在重写规则中使用 时要小心[R]
。如果不包含 HTTP 代码,Apache 将默认使用302
,这是一个临时重定向。如果 URL 结构将永久更改(或更改时间超过一年),最好指定永久重定向,即301
。
关于 RewriteRule 标志的说明:
旗帜 | 意义 |
---|---|
R |
执行重定向 |
NC |
不需注意Url的大小写 |
L |
停止处理其他规则 |
L
如果定义中没有RewriteRule
但之后有更多规则,那么 Apache 可能会继续运行。