htaccess使用重定向重写URL导致循环

时间:2015-04-17 00:18:22

标签: .htaccess mod-rewrite redirect

我有一个现有网站,其中包含带索引的URL中的php。我想将URL更改为不包含PHP,以便将page.php重写为http://example.com/thepage

重写工作正常,但当我尝试使用page.php

尝试访问页面时,重定向会导致“页面无法循环显示”错误

我需要弄清楚如何设置重定向并重写网址,因为Google现在已经将PHP网址和漂亮网址编入索引。

我在网上看了无数页,但找不到答案。

请帮忙。

这是我的htaccess

# The redirect below caused a loop when I access the page as 
# http://example.com/thepage.php
# Moving the redirect after the rewrite didn't work either. 

Redirect 301 /thepage.php http://example.com/thepage

RewriteEngine on
# Rewrite works. The page does display corectly for this link
#    http://example.com/thepage

<IfModule mod_rewrite.c> 
   Options +FollowSymLinks 
   Options +Indexes 
 #  RewriteEngine On 
   RewriteCond %{SCRIPT_FILENAME} !-d 
#RewriteRule ^photos([^\.]+)$ photos [NC,L]
   RewriteRule ^([^\.]+)$ $1.php [NC,L] 
</IfModule>


ErrorDocument 404 http://example.com/

谢谢

2 个答案:

答案 0 :(得分:0)

你的重写规则是从它的声音向后。

在这里,我们将捕获所有不包含句点的php文件,并仅使用不带扩展名的名称将它们重定向到目录URI。 [R=301]是一个永久性的301重定向,可以告诉该页面不再位于旧位置。

RewriteEngine on
RewriteRule ^([^\.]+).php$ $1 [NC,L,R=301] 

您可能希望仅在没有301的情况下使用R对其进行测试,以确保其正常运行。如果您执行的301重定向不起作用,它将被缓存在最终用户的浏览器缓存中,直到它过期。

Apache有一个extensive reference on remapping URLs with redirects

答案 1 :(得分:0)

我终于能够回到这个问题并找到了解决方案。我希望这可以帮助别人。我在这个问题上撕裂了我的头发。

我找到了许多例子,但没有找到我需要的组合

#Force non-www:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301,NC]

RewriteBase /

# hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).php [NC]
RewriteRule ^ %1 [R,L,NC]

# To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]

ErrorDocument 404 http://example.com/