我正在尝试在我的网站上创建干净的网址。现在我成功配置了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]
谢谢!
答案 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/