0

我似乎无法让我的 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),他们会自动重定向到干净的 URL。

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

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

4

1 回答 1

0

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

但是您还想强制将实际请求 /page.php?id=1 的访问者永久重定向到“干净” URL /videos,以便他们收到查询字符串 ugliness 不再适合他们的消息。

问题是即使重写的请求也必须重新运行您的 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

这将始终默默地将 /videos 重写为 /page.php?id=1&redirect=done,但它只会将 /page.php 重定向到 /videos,如果对 page.php 的请求没有以redirect=done( 以及确实有一个以 ) 开头的查询字符串id=1

这很复杂,但这是我能想到的打破无限循环的唯一方法。

于 2013-03-25T19:06:55.297 回答