清理URL重定向循环

时间:2009-01-31 16:06:00

标签: apache .htaccess url-rewriting

我正在尝试在我的网站上创建干净的网址。现在我成功配置了apache,因此每个请求(如 mysite.com/page )都能正常工作。但我也希望将 mysite.com/page.php 的请求重定向到 mysite.com/page 。我在.htaccess中设置环境变量来检查我是否已被重定向以防止循环,但我仍然得到它们...... 这是.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]

谢谢!

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:1)

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

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

哦,RewriteCond directive的第一个参数不是正则表达式而只是一个字符串。因此,转义.是错误的。

答案 2 :(得分:0)

是否有一些原因导致您无法使用字符串结尾符号$?

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

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

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

答案 3 :(得分:0)

另一个快速&amp;我发现在这些情况下阻止循环的脏方法是添加一个查询字符串,然后在重定向中检查它是否存在。

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/