Apache 清除URL重定向循环

Apache 清除URL重定向循环,apache,.htaccess,url-rewriting,Apache,.htaccess,Url Rewriting,我正在尝试在我的网站上创建干净的URL。现在,我成功地配置了apache,所以像mysite.com/page这样的每个请求都能正常工作。但我也希望对mysite.com/page.php的请求将被重定向到mysite.com/page。我已经在.htaccess中设置了环境变量来检查我是否已经被重定向以防止循环,但我仍然得到它们。。。 以下是.htaccess: <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEng

我正在尝试在我的网站上创建干净的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]

选项+FollowSymlinks
重新启动发动机
重写基/
#设置变量
重写规则^$-[L]
重写规则^(.*)$$1[E=重写:0]
#这个很好用
#使mysite.com/page正常工作,并将重写变量设置为1
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_FILENAME}\.php-f
重写规则^(.*)$$1.php[L,E=重写:1]
#但是如果我启用这个,我会被重定向,然后陷入循环
#将mysite.com/page.php重定向到mysite.com/page,但仅当重写不是1时
#重写cond%{ENV:重写}^1$
#重写规则^(.*)\.php$$1[R=301,L]

谢谢

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


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

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

的第一个参数不是正则表达式,而是字符串。所以转义
是错误的。

有什么原因不能使用字符串结尾字符$

RewriteRule ^/(.+)\.php$ /$1
将/page.php重定向到/page,但不会在/page上执行任何重定向


从根本上说,使用诸如设置环境变量和添加重定向状态检查之类的技术不会很可靠。

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

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

在此网站上找到:

欢迎使用堆栈溢出。感谢您清楚地表达您的问题,提供代码,并显示哪些有效,哪些无效。如果您的apache日志中有有用的信息,也请发布。有时,当你看到日志时,重定向问题变得更加明显。不幸的是,我无法访问此类信息。宾果!工作起来很有魅力,不需要环境变量。
RewriteCond %{QUERY_STRING} !a=a
RewriteRule ^(.*)\.php$ %1 [NC,R=301,L]
RewriteRule ^(.*)$ $1.php?a=a [NC,L]