2010-10-01 74 views
0

我正在检查审查页面的URL结构,可以按城市,县,明星和技术人员进行筛选。我想让页面看起来像是静态的HTML页面,并用连字符代替加号。 我的目标: -Apply新样式的URL,而无需修改评论网页,只需将htaccess文件 - 设置 高达301从旧样式的URL新样式的URL重定向 - 转换的长处为连mod_rewrite可能无限循环?

目前审核状态的网址是这样的:

domain.com/reviews/?city=City+Name

domain.com/reviews/?city=City+Name &页= 2

domain.com/reviews/?county=County+Name

domain.com/reviews/?county=County+Name &页= 2

domain.com/reviews/?stars=4

domain.com/reviews/?stars=4 &页= 2

domain.com/reviews/?tech=Tech+Name

domain.com/reviews/?tech=Tech+Name &页= 2

我的目标是让他们看起来像这样(和301旧式网址为新样式的网址):

domain.com/reviews/city/City-Name.html

domain.com/reviews/city/City-Name/page/2.html

domain.com/reviews/county/County-Name.html

domain.com/reviews/county/County-Name /page/2.html

domain.com/reviews/stars/4.html

domain.com/reviews/stars/4/page/2.html

domain.com/reviews/tech/Tech-Name.html

domain.com/reviews/tech/Tech-Name/page/2.html

市,县和技术名称不总是包含加号(即波士顿VS新+纽约)和一些有超过一个加号。目前,这是我所掩盖了新样式的URL旧式的网址(这顺便说一句正常工作):

##FIRST PAGE REVIEWS (ie. reviews/city/city-name.html) 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)\-(.*)\-(.*)\.html "/reviews/?$1=$2+$3+$4+$5+$6" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)\-(.*)\.html "/reviews/?$1=$2+$3+$4+$5" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)\.html "/reviews/?$1=$2+$3+$4" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\.html "/reviews/?$1=$2+$3" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\.html "/reviews/?$1=$2" [NC,L] 

##PAGINATED REVIEWS (ie. reviews/city/city-name/page/2.html) 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)\-(.*)\-(.*)/page/(.*)\.html "/reviews/?$1=$2+$3+$4+$5+$6&page=$7" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)\-(.*)/page/(.*)\.html "/reviews/?$1=$2+$3+$4+$5&page=$6" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)\-(.*)/page/(.*)\.html "/reviews/?$1=$2+$3+$4&page=$5" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)\-(.*)/page/(.*)\.html "/reviews/?$1=$2+$3&page=$4" [NC,L] 
RewriteRule ^reviews/(.*)/(.*)/page/(.*)\.html "/reviews/?$1=$2&page=$3" [NC,L] 

说我有是301-ING旧式的URL到新的麻烦的部分样式的网址。这是我到目前为止:

RewriteCond %{QUERY_STRING} (.*)=(.*) [NC] 
RewriteRule ^reviews/(.*) /reviews/%1/%2.html? [NS,R=301,NC] 

RewriteCond %{QUERY_STRING} (.*)=(.*)&page=(.*) [NC] 
RewriteRule ^reviews/(.*) /reviews/%1/%2/page/%3.html? [NS,R=301,NC] 

当我尝试这个FireFox给我的“该页面没有正确重定向”错误。有任何想法吗?

回答

0

是的,这可能是一个无限循环。使用THE_REQUEST而不是检查request line

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^?\ ]*\?([^=]+)=([^\ ]*)&page=([^\ ]*) [NC] 
RewriteRule ^reviews/ /reviews/%1/%2/page/%3.html? [NS,R=301,NC] 
RewriteCond %{THE_REQUEST} ^[A-Z]+\ /[^?\ ]*\?([^=]+)=([^\ ]*) 
RewriteRule ^reviews/ /reviews/%1/%2.html? [NS,R=301,NC] 

注意,如果参数的数量和顺序是与此不同,这将失败。

+0

非常好!谢谢你的工作。唯一的是我需要将这些加号转换为连字符。目前“/ reviews /?city = City + Name”将带您到“/reviews/city/City+Name.html”,它应该是“... City-Name.html”。还有一种方法可以将所有内容都转换为小写? – Yev 2010-10-01 18:10:11

+0

@YevgeniyЖеняVan Chuchin:虽然mod_rewrite可以实现,但它相当复杂,因为您一次只能替换固定数量的事件(请参阅http://stackoverflow.com/questions/3791548/mod-rewrite -rule到强制规范%的编码/ 3806538#3806538)。更高层次的语言更适合做这种工作。 – Gumbo 2010-10-01 18:16:15

+0

我没有固定的金额。发生了5次就足够了,这就是我在第一部分中所做的事情(用新风格掩盖旧式URL)。 – Yev 2010-10-01 18:19:35