【问题标题】:RewriteRule - change middle of the linkRewriteRule - 改变链接的中间
【发布时间】:2014-04-23 01:31:16
【问题描述】:

我将网站的 /news/ 部分移至 /about/news/。现在我需要将旧链接重定向到移动的页面。我尝试在 .htaccess 中使用 RewriteRule,但它似乎不起作用:

RewriteEngine on
RewriteBase /

ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 500 /500.php

RewriteRule ^$ inner.php?pathstring=/main/
RewriteRule ^(.+str=.*)$ inner.php?path=$1 [L]
RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

RewriteRule ^/news/(.*)$ about/news/$1 [R,L]

我在这里发布了我的整个 .htacces,因为它是由现在无法使用的其他人编写的,并且作为 php 中的菜鸟,我担心它可能会影响我以某种方式重定向的尝试。

【问题讨论】:

  • 将它移到之前您的其他 RewriteRules。您的第三个匹配任何没有 . 的内容(任何不是 . 的字符匹配 1 到无限次)。
  • 谢谢我做到了,但重定向仍然没有发生。也许我的正则表达式有错误?我得到的只是 404。

标签: php .htaccess mod-rewrite


【解决方案1】:

你的问题是你的第三个 RewriteRule:

RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

尸检:

  • ^ - 字符串必须从下一个匹配开始
  • ([^\.]+) - 匹配任何不是. 的字符(您需要在正则表达式中将其转义为. 是“任何字符”)1 到无限次(即+
  • $ - 字符串必须以上一个匹配结束

..因此,只有在 URL 中没有 . 时,您在底部的重定向才会起作用,例如。 /news/blabla/mysite.html.

如何解决?只需将它移到其他规则之上,以便它首先尝试匹配它。如果您的更改是永久性的,您还应该将R 更改为R=301 以确保它发送301 Moved Permanently 而不是302 Found(不会被缓存)。

RewriteRule ^/news/(.*)$ about/news/$1 [R=301,L]
RewriteRule ^$ inner.php?pathstring=/main/
RewriteRule ^(.+str=.*)$ inner.php?path=$1 [L]
RewriteRule ^([^\.]+)$ inner.php?path=$1 [QSA]

【讨论】:

  • 非常感谢!尽管如此,重定向并没有发生。也许我的正则表达式有错误?
【解决方案2】:

试试这个代码:

RewriteEngine On

RewriteRule ^(news(?:/.*)?)$ /about/$1 [R=301,L,NC]
RewriteRule ^$ inner.php?pathstring=/main/ [L,QSA]
RewriteRule ^(.+?str=.*)$ inner.php?path=$1 [L,QSA,NC]
RewriteRule ^([^.]+)$ inner.php?path=$1 [L,QSA]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2016-12-16
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多