【问题标题】:.htaccess rewriterule and redirect 301 - 301 not working.htaccess rewriterule 和重定向 301 - 301 不起作用
【发布时间】:2013-03-14 09:31:33
【问题描述】:

我的 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 的原因,但它只是不起作用。

【问题讨论】:

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


    【解决方案1】:

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

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

    问题在于,即使是重写的请求也必须重新运行您的 Apache 指令,这意味着 clean 将重写为实际,然后将重定向到 clean,它将重写为实际,等等无限。这就是您遇到致命错误的原因。

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

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

    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 的请求没有以结尾的查询字符串,它只会将 /page.php 重定向到 /videos redirect=done(也有一个以id=1开头的查询字符串)。

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

    【讨论】:

    • 实际上只是想让最后一行工作。它不会自动重定向到我刚才创建的干净 URL(有效)
    • 我不清楚您要做什么。如果您编辑您的问题并举例说明访问者将在浏览器中键入的内容(或公共链接的外观)以及服务器上的路径实际上需要如何查找相关文件或脚本,这可能是最好的。目前我们只有您现有的配置作为线索,因为这是错误的,所以不是一个很好的起点。
    • 抱歉,我认为它很容易被发现。清理 URL(有效)mydomain.com/videos 301 重定向(无效)mydomain.com/page.php?id -> mydomain.com/videos
    • 哦,我想我明白了。您不能将实际路径重定向到干净的路径,因为它会被静默地重写为实际路径。然后它将被重定向到干净的路径,以此类推。这样做的唯一方法是创建一个新的实际路径,以便 RewriteEngine 可以确定是否重写。
    • 我已经完全改变了我的答案,这样它就可以实现我认为你想要实现的目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2013-04-06
    • 2017-06-30
    • 2014-07-05
    • 2014-12-21
    相关资源
    最近更新 更多