使用简单的htaccess规则重定向循环

时间:2013-09-24 02:24:35

标签: apache .htaccess redirect mod-rewrite

我一直把它拉出来。它在服务器迁移之前有效!

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

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

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

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

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

然而,灾难已经发生,现在它会导致重定向循环。

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

如何重新使用它以使其工作?或者是否需要切换WHM?

谢谢!

2 个答案:

答案 0 :(得分:2)

这就是.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,因为我不希望规则在我的浏览器上缓存,直到我确认其按预期工作,然后,一旦我能确认其按预期工作,我就会从{{{ 1}}到R=302

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

  

然而,灾难已经发生,现在它会导致重定向循环。

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

答案 1 :(得分:2)

完全相同的.htaccess文件将根据放置位置的不同而有所不同,因为[L] ast标志意味着根据位置的不同而有所不同。在...... conf中,[L] ast意味着所有已完成的处理因此退出,但在.htaccess中,完全相同的[L] ast标志意味着从此文件的顶部开始

要将代码块从... conf移动到.htaccess时按预期工作,大多数.htaccess文件将需要这些调整中的一个或另一个:

  • 将[L] ast标志更改为[END]。 (问题是,[END]标志仅在更新的[版本2.3.9及更高版本] Apaches中可用,并且在早期版本中甚至没有"后退"。

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

*

RewriteCond %{ENV:REDIRECT_STATUS} !^[\s/]*$
RewriteRule ^ - [L]