首页 > 解决方案 > 重定向 301 时出现内部服务器错误

问题描述

我的旧页面网址如下所示

https://blabla.com/us/sample-data/us/

我的新网址看起来像这样

https://blabla.com/us/data/sample/us/

我将此添加到我的 htaccess

<IfModule mod_rewrite.c>
Redirect 301 ^sample-data/us/ /data/sample/us/ [NC,L]
</IfModule>

但我得到了一个internal server error

url 中的第一个us是动态的,具体取决于用户来自的国家/地区。第二个us是国家样本数据。这是目前10个国家的名单。可能更多。

我试过了

RewriteRule ^sample-data/us/ /data/sample/us/ [L,R=301,NC]

但也没有运气。它也重定向

https://blabla.com/data/sample/us/错过第一个 /us/

如何让这个重定向工作?谢谢

标签: .htaccess

解决方案


<IfModule mod_rewrite.c>
Redirect 301 ^sample-data/us/ /data/sample/us/ [NC,L]
</IfModule>

但我收到内部服务器错误

因为该指令在语法上无效。[NC,L]参数是属于 mod_rewriteRewriteRule指令的参数。Redirect是一个 mod_alias 指令 - 该指令没有这样的“标志”参数Redirect

RewriteRule ^sample-data/us/ /data/sample/us/ [L,R=301,NC]

但也没有运气。它也重定向

https://blabla.com/data/sample/us/错过第一个/us/

您似乎缺少/us/指令中的第一个(虚拟路径段),所以我根本看不到这是如何重定向的(除非您看到缓存的响应,或者其他东西正在执行重定向)?该.htaccess文件可能位于文档根目录中,您可能正在请求 URL /us/sample-data/us/,而第一个/us/是虚拟的 - 所以上面的指令不可能做任何事情?

如果第一个路径段是可变的并且您需要重定向到相同的路径段并假设它由两个小写的 az 字母组成,那么请尝试以下操作:

RewriteRule ^([a-z]{2})/sample-data/us/ /$1/data/sample/us/ [R=302,L]

但是第二个/us/呢?这不是也可变的吗?(两个字母)的第一个和第二个实例/XX/应该相同吗?

首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。您需要在测试前清除浏览器缓存。

我已经删除了NC标志 - 这真的应该是不区分大小写的匹配吗?

请注意,如果您的.htaccess文件中有现有指令,那么顺序很重要。一般来说,外部重定向需要靠近顶部,当然在你的前端控制器之前。


推荐阅读