1

我一直在努力解决这个问题。它在服务器迁移之前工作!

好的,基本上它就像这样简单:

我有一个 .php 文件,我想通过重写规则查看使用 SEO 友好 URL 的内容。

为了规范化和防止重复内容,我想将 .php 版本 301 转换为 SEO 友好版本。

这是我使用的,并且一直在新服务器上工作到现在:

RewriteRule ^friendly-url/$ friendly-url.php [L,NC]
RewriteRule ^friendly-url.php$ /friendly-url/$1 [R=301,L]

然而灾难已经袭来,现在它导致了重定向循环。

从逻辑上讲,我只能假设在这个版本的 Apache 中它正在跳闸,因为它看到正在运行的脚本是 .php 版本,所以它再次尝试重定向。

我怎样才能重新工作以使其工作?或者是否有我需要在 WHM 中切换的配置?

谢谢!!

4

2 回答 2

3

这就是你的.htaccess样子:

Options +FollowSymLinks -MultiViews 

RewriteEngine On
RewriteBase /

# To externally redirect /friendly-url.php to /friendly-url/
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+(friendly-url)\.php [NC]
RewriteRule ^ /%1/? [R=302,L]

## To internally redirect /anything/ to /anything.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(.+?)/$ $1.php [L]

请注意我是如何使用R=302的,因为在我确认它按预期工作之前,我不希望规则缓存在我的浏览器上,然后,一旦我可以确认它按预期工作,我就会R=302R=301.

请记住,自从您使用 以来,您可能还从以前的尝试中被缓存过R=301,因此您最好尝试从您使用过的其他浏览器访问它,以确保其正常工作。

然而灾难已经袭来,现在它导致了重定向循环。

它会导致重定向循环,因为您将其重定向到自身,我的代码的不同之处在于我捕获了请求,并从那里重定向 php 文件以使其友好,然后使用内部重定向。

于 2013-09-24T02:27:59.870 回答
2

完全相同的 .htaccess 文件将根据其放置的位置而有所不同,因为 [L]ast 标志的含义因位置而异。在 ...conf 中,[L]ast 表示所有已完成的处理,所以退出,但在 .htaccess 中,完全相同的 [L]ast 标志表示从该文件的顶部重新开始

为了在将代码块从 ...conf 移动到 .htaccess 时按预期工作,大多数 .htaccess 文件将需要以下一项或多项调整:

  • 将 [L]ast 标志更改为 [END]。(问题是,[END] 标志仅在较新的 [2.3.9 及更高版本] Apache 中可用,甚至不会在早期版本中“回退”。)

  • 在每个 .htaccess 文件的顶部添加这样的样板代码:

*

RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
RewriteRule ^ - [L]
于 2015-09-13T22:19:33.730 回答