Apache mod_rewrite友好的URL以及相应的301重定向

时间:2012-02-21 11:23:55

标签: mod-rewrite url-rewriting http-status-code-301 seo

问题:

旋转我的车轮,读了一下这一段,现在寻求一些帮助。我正在寻找一组非友好的URL(实际上有更多的“组”,但这应该是我的一个例子):

  1. domainname.com/?section=zebras
  2. domainname.com/?section=monkeys&id=555
  3. 并将它们转换为友好的URL,并在旧版本上执行301,以便任何旧书签(和搜索引擎)仍然可以解决它们。我正在寻找的新格式是:

    1. domainname.com/zebras /
    2. domainname.com/monkeys/555
    3. 我完全打算为每个场景编写单独的RewriteCond / RewriteRule组合,因此我不一定需要一个能够捕获所有场景的超级规则。哦,这就是.htaccess。

      我的进步:

      我最初进入重定向循环,因为我只是背靠背做两个RewriteRules - 一个用于友好URL,另一个用于301重定向。我最喜欢的方式(到目前为止)遇到了重定向循环(适用于我的场景#1):

      RewriteCond %{ENV:REDIRECT_STATUS} !200
      RewriteCond %{QUERY_STRING} ^section=zebras$ [NC]
      RewriteRule ^.*$ http://www.domainname.com/zebras/? [R=301,NC,L]
      
      RewriteRule ^zebras/$ /index\.php?section=zebras [NC,L]
      

      然而,我想要的东西不仅仅是“斑马”(例如,我希望它也适用于“狮子”),所以我试图让它更通用。我现在尝试的是这样的:

      RewriteCond %{ENV:REDIRECT_STATUS} !200
      RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
      RewriteRule ^section=([a-z]+)$ http://www.domainname.com/$1/? [R=301,NC,L]
      
      RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]
      

      然而,这不起作用。我觉得我有一些“不太正确”的东西,我只是不知道它是什么 - 有些东西我缺少或在某处格式错误。对于冗长的描述提前抱歉,只是想明确。

1 个答案:

答案 0 :(得分:1)

这样做:

RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.\w+|/)$ 
RewriteRule (.*) /$1/ [R,L]

RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
RewriteRule ^ /%1/? [R=301,NC,L]

RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]

RewriteCond %{QUERY_STRING} ^section=([a-z]+)&id=(\d+)$ [NC]
RewriteRule ^ /%1/%2/? [R=302,NC,L]

RewriteRule ^([a-z]+)/(\d+)/$ /index\.php?section=$1&id=$2 [NC,L]

描述

阻止循环:

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

防止斜杠问题:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !(\.\w+|/)$ 
RewriteRule (.*) /$1/ [R,L]

处理只有section=([a-z]+)的重写:

RewriteCond %{QUERY_STRING} ^section=([a-z]+)$ [NC]
RewriteRule ^ /%1/? [R=302,NC,L]

RewriteRule ^([a-z]+)/$ /index\.php?section=$1 [NC,L]

处理只有section=([a-z]+)&id=(\d+)的重写:

RewriteCond %{QUERY_STRING} ^section=([a-z]+)&id=(\d+)$ [NC]
RewriteRule ^ /%1/%2/? [R=302,NC,L]

RewriteRule ^([a-z]+)/(\d+)/$ /index\.php?section=$1&id=$2 [NC,L]

你的规则中的错误:

section=([a-z]+)在URI部分中不可用。所以,RewriteRule ^section=([a-z]+)$从未匹配。