问题:
旋转我的车轮,读了一下这一段,现在寻求一些帮助。我正在寻找一组非友好的URL(实际上有更多的“组”,但这应该是我的一个例子):
并将它们转换为友好的URL,并在旧版本上执行301,以便任何旧书签(和搜索引擎)仍然可以解决它们。我正在寻找的新格式是:
我完全打算为每个场景编写单独的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]
然而,这不起作用。我觉得我有一些“不太正确”的东西,我只是不知道它是什么 - 有些东西我缺少或在某处格式错误。对于冗长的描述提前抱歉,只是想明确。
答案 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]+)$
从未匹配。