.htaccess rewriterule和重定向301 - 301不工作

时间:2013-03-25 00:05:24

标签: apache mod-rewrite redirect url-redirection mod-alias

我似乎无法使我的301重定向工作,mod_alias与mod_rewrite一起启用。

我的重写工作正常,但301不起作用。基本上我要做的是从动态php页面设置“干净”的URL,这很好......

每个动态页面的另一部分,我希望它们重定向到正确的“干净”网址。

这是我的.htaccess

#
# Options below ensure that all traffic is directed to www.mydomain
#
Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^mydomain.com
RewriteRule (.*) http://www.mydomain.com/$1 [R=301,L]
RewriteRule ^index.php$ http://www.mydomain.com/ [R=301,L]

#
# URL Rewrites
#
RewriteRule videos page.php?id=1 [L]

#
# Custom redirects from OLD URLs
#
redirect 301 /page.php?id=1 /videos

努力实现......

mydomain.com/videos

(this works - redirect does not)  

如果有人访问动态页面(page.php?id = 1),他们会自动重定向到干净的网址。

mydomain.com/page.php?id=1 -> mydomain.com/videos

我尝试在RewriteRule中使用R = 301,但发生了致命错误。所以这就是我创建重定向301的原因,但它只是不起作用。

1 个答案:

答案 0 :(得分:0)

好的,所以如果访问者请求/视频,那么您希望将请求静默地重写为实际路径/page.php?id=1,以便您可以宣传“干净”的URL /视频并隐藏查询字符串丑陋。

但您还想强制实际请求/page.php?id=1的访问者永久重定向到“干净”的网址/视频,这样他们就会收到查询字符串丑陋不再适合他们眼睛的消息

问题是即使重写的请求也必须重新遍历你的Apache指令,这意味着clean将重写为实际,然后重定向到clean,这将重写为实际,等等无限。这就是为什么你会遇到致命的错误。

打破此循环的唯一方法是更改​​实际路径或插入一个虚拟变量,允许RewriteEngine在重写完成一次后停止。

例如,您可以使用以下内容:

RewriteCond %{QUERY_STRING} !&redirect=done$
RewriteCond %{QUERY_STRING} ^id=1
RewriteRule /page.php /videos [R=permanent]
RewriteRule /videos /page.php?id=1&redirect=done

这将始终默默地重写/视频到/page.php?id=1&redirect=done,但如果page.php的请求没有查询字符串,它只会将/page.php重定向到/ videos以redirect=done结尾(并且还有一个以id=1开头的查询字符串。)

这是令人费解的,但这是我能想到打破无限循环的唯一方法。