9

我正在尝试在我的网站上创建干净的 URL。现在我成功配置了 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

4 回答 4

14

如果请求已经被重定向一次(参考),则在现有的重写规则上方添加此规则以停止重定向:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
于 2009-01-31T16:18:26.067 回答
1

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

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

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

于 2009-01-31T16:26:28.187 回答
0

为什么不能使用字符串结尾终止字符 $ 有什么原因吗?

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

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

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

于 2009-09-28T21:51:30.540 回答
0

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

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/

于 2013-02-02T02:17:55.497 回答