我尝试了几个小时在 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 文件中包含的任何指令设置在目录块中,因为它将具有相同的效果,且性能更佳。