在 htaccess 中重命名和重定向页面失败

Renaming and redirecting pages fails in htaccess

很抱歉问这个问题,因为答案看起来很简单。然而,经过三个小时的反复试验,我毫无头绪。

我在一个网站上有几个页面使用 url 中的参数。我想将其更改为更规则的 url。示例:

domain.com/pag.php?id=1-awesome-page 应该成为域。com/awesome-page

到目前为止一切顺利,但到目前为止我遇到了三个问题。 1. 旧页面仍然可以访问,Google 会将其索引为重复内容。当我尝试重定向它时,出现无限循环错误。 2. 无论出于何种原因,有时某些图像(直接来自内容)会在新命名的页面上被剥离。我尝试使用 base-url 并重命名图像和 urls,但到目前为止什么都没有。 3. 此外,重定向不关心我输入的是 id=1-awesome-page 还是 id=2-worthless-page。全部重定向到第一个。

在我尝试过的事情中。

RewriteCond %{QUERY_STRING} id=1-awesome-page
RewriteRule ^pag\.php$ /awesome-page? [L,R=301]
RewriteRule  ^awesome-page?$     pag\.php?id=1  [NC]

你想做的事 mod_rewrite 无法真正完成,除非你想为每个页面制定规则,这可能会大大降低你的网站速度。这是,因为你不能凭空召唤1 in 1-awesome-page,而且你的pag.php页面似乎无法仅根据它的seo加载页面姓名。如果您需要使用该号码,则需要在 url.

中的某处包含该号码

关于您的问题:

您提到的错误无法用您的 .htaccess 的当前迭代重现。您之前可能有一个无限循环,并且由于您使用 R=301 进行测试,浏览器将缓存此重定向并且仅在您请求第一个资源时请求第二个资源。您应该使用 [R,L] 进行测试,只有在一切正常时才更改为 [R=301,L]。不这样做会导致奇怪的行为,以及您对 .htaccess 不期望的行为。

当您有一个 url a 和一个 url b,并且想要将 a 重定向到 b,并且想要要在内部将 b 重写为 a,您需要确保任何给定时间都不能匹配两个规则。您可以使用 %{THE_REQUEST} 技巧或使用 END 标志。 this answer.

中概述了两者

如果您在制作 url 后遇到页面上的资源未加载的问题,您可能使用了相对的 url。 This question 概述了解决此问题的可能性。您可以使 url 相对于您网站的根目录或使用 <base href="/">.


以下适用于 /pag.php?id=123-news-page/news/123/news-page

RewriteCond %{THE_REQUEST} pag\.php\?.*id=([^-]+)-([^&\s]+)
RewriteRule ^pag\.php$ /news/%1/%2? [L,R]
RewriteRule  ^news/([^/]+)/([^/]+)/?$ pag.php?id=- [L]