清理URLredirect循环

我正在尝试在我的网站上创build干净的url。 现在我成功地configuration了Apache,所以mysite.com/page等每一个请求都能正常工作。 但我也希望对mysite.com/page.php的请求将被redirect到mysite.com/page 。 我已经在.htaccess中设置环境variables来检查我是否已经被redirect,以防止循环,但我仍然得到他们…这里的.htaccess:

<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteBase / # set the variable RewriteRule ^$ - [L] RewriteRule ^(.*)$ $1 [E=REWROTE:0] # this works fine # make mysite.com/page work and set REWROTE variable to 1 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [L,E=REWROTE:1] # but if i enable this, i get redirected and then stuck in a loop # redirect mysite.com/page.php to mysite.com/page , but only if REWROTE not 1 #RewriteCond %{ENV:REWROTE} !^1$ #RewriteRule ^(.*)\.php$ $1 [R=301,L] 

谢谢!

如果请求已被重定向一次( ref ),则将此规则添加到现有重写规则上方以停止重定向:

 RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule .* - [L] 

您可以检查请求行以查询最初请求的内容:

 RewriteCond %{THE_REQUEST} ^[AZ]+\ (/[^\ ]*)\.php[?\ ] RewriteRule \.php$ %1 [R=301,L] 

呵呵, RewriteCond指令的第一个参数不是一个正则表达式,而是一个字符串。 所以逃避了. 是错的。

有什么理由不能使用字符串结束字符$?

 RewriteRule ^/(.+)\.php$ /$1 

会将/page.php重定向到/页面,但不会在/页面上进行任何重定向。

从根本上说,使用像设置环境变量和添加对REDIRECT_STATUS的检查等技术不会非常健壮。

另一个快速和肮脏的方式来防止在这些情况下循环我发现是添加一个查询字符串,然后检查其重定向的存在。

 RewriteCond %{QUERY_STRING} !a=a RewriteRule ^(.*)\.php$ %1 [NC,R=301,L] RewriteRule ^(.*)$ $1.php?a=a [NC,L] 

在这个网站上找到: http : //answers.oreilly.com/topic/542-how-to-properly-redirect-for-maximum-seo/