.htaccess 规则将 301 重定向 /?my_foo=bar 到 /foo/bar/

.htaccess 规则将 301 重定向 /?my_foo=bar 到 /foo/bar/

我尝试了几个小时在 htaccess 文件中构建一个简单的 301 重定向(我认为是这样),但没有成功。

我的网址如下:www.example.com/?my_foo=bar

我希望它 301 重定向到:www.example.com/foo/bar/

我读了很多关于这个主题的指南,也试了几十个代码示例。但都不起作用。

提前致谢...


详细来说,我最近的尝试是:

RewriteCond %{QUERY_STRING} ^my_foo=(.*)$
RewriteRule ^(.*)$ http://www.example.com/foo/$1/? [L,R=301]

在我看来,我创建了一个条件来匹配查询字符串我的_foo 等于 任何事物

然后,我添加了重定向:链接每一页符合这一标准(即^(.*)$) 到新地址

我还在末尾添加了一个问号,以免通过不断地重新添加相同的查询字符串而获得递归函数。

它仍然不起作用。

我究竟做错了什么?

答案1

我猜你的 apache 配置没有设置为允许使用.htaccess文件。你需要通过添加选项来全局设置它或为特定目录设置它AllowOverride All

.htaccess 文件提供了一种根据每个目录进行配置更改的方法。

要激活 DocumentRoot 的默认设置,请将选项添加到默认 vhost 文件。您还可以在虚拟主机配置中仅为特定目录添加选项。

例如,在安装了 apache 2.2 的 ubuntu 中/etc/apache2/sites-available/default

<Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
 </Directory>

必读内容(您的 apache2 选项可能会有所不同,这是针对 2.2 的):https://httpd.apache.org/docs/2.2/howto/htaccess.html

答案2

由于您正在寻找重写条件参数而不是重写规则,因此您需要使用 %1:

RewriteCond %{QUERY_STRING} ^my_foo=(.*)
RewriteRule .* http://www.example.com/foo/%1/ [L,R=301]

来源 :https://wiki.apache.org/httpd/RewriteQueryString

无论如何,如前所述,您需要命令AllowOverride All来允许 .htaccess

<Directory /var/www/>
     AllowOverride All
</Directory>

来源 :https://httpd.apache.org/docs/2.4/en/howto/htaccess.html

顺便说一句,如果您有权访问服务器配置,则应该使用目录块:

如果您有权访问 httpd 主服务器配置文件,则应完全避免使用 .htaccess 文件。使用 .htaccess 文件会降低 Apache http 服务器的速度。最好将 .htaccess 文件中包含的任何指令设置在目录块中,因为它将具有相同的效果,且性能更佳。

相关内容