使用mod_rewrite避免重复的URL

时间:2011-06-29 12:09:52

标签: mod-rewrite seo

目前,我有一个简单的.htaccess,可以整理我的页面网址,将.php从最后敲掉,或添加它,具体取决于你查看它的方式。

基本上,/ about.php将成为/ about。

然而,这导致我的页面可以在这两个网址上访问。我可以吮吸它并使用rel = canonical标签,但我也想在我的htaccess中整理它。

除了手动指定每个网址之外,是否有更好的方法(聪明的规则)将.php设置为无.php版本?

另外,我真的需要那些重写规则吗?

<IfModule mod_rewrite.c>


RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]


ErrorDocument 404 /404


</IfModule>

2 个答案:

答案 0 :(得分:0)

要将每个.php-URL重定向(301)到非.php版本(如果它是现有文件),您可以使用此文件:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]

您的.haccess中的前两个RewriteCond并不是真正需要的,因为无论如何您都会遇到一些冲突,例如:如果您有foo.htmfoo.htm.php文件,请求foo.htm时应显示哪个文件?

完整的mod_rewrite块:

RewriteEngine On
# redirect /foo.php to /foo
 RewriteCond %{REQUEST_FILENAME} -f
 RewriteCond %{THE_REQUEST} \.php\ HTTP/.\..$
 RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
# rewrite /foo to /foo.php
 RewriteCond %{REQUEST_FILENAME}.php -f
 RewriteRule ^(.*)$ /$1.php [QSA,L]

答案 1 :(得分:0)

在原始规则中,您只是说任何不是文件或目录的页面都必须重定向到附加.php的相同名称。

因此,您需要做的是“删除”对.php文件的访问权限,以便通过重定向来屏蔽它。 因此,您会告诉客户端浏览器foo/foo.php实际上是foo/foo

这将触发客户对foo/foo的新请求。

然后告诉服务器foo/foo实际上是foo/foo.php。这将触发对foo/foo.php的内部请求。所以这里有一个循环。我们需要避免这种情况。我发现最好的解决方法是检查%{REDIRECT_URL}是否为空。

最后规则是:

# External redirection from real file to virtual with safe guard for internal redirection.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REDIRECT_URL} !^$ 
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]

# Internal redirection to real file.
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]

不要忘记任何重写/重定向会触发新请求!

请参阅:How does url rewrite works?