我目前正在咀嚼这个问题:我正在改造一种CMS系统,结果将是URL看起来完全不同,但我想保存链接和书签,所以我把这个.htaccess文件拼凑在一起:< / p>
RewriteEngine on
# Rewrite old links to match with new URL syntax:
# universal rewrite
RewriteCond %{REQUEST_URI}~%{QUERY_STRING} ^(.*?\/*)? (viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^(.+).php$ %1?action=redirect&source=$1&%3 [R=301,L,NE]
并且它有效,http://example.com/news.php?action=newsstory&nid=51实际上变为http://example.com/?action=redirect&source=news&action=newsstory&nid=51
但是你可以看到问题,一个双重动作。使用“动作”不是最具创造性的术语,但它是我需要提供的脚本正在使用的,以及我从旧的脚本中得到的内容,所以我需要:
如果你想知道,问号需要使用RewriteCond,无法让它以任何其他方式工作,所以摆脱它的任何解决方案都是受欢迎的。
好吧,谢谢你调查,甚至可能对事物有所了解,我只是进入了整个正则表达式的事情,但还没有完全弄清楚变量是如何从链接的RewriteRule传递到另一个,也许本来就是得到的方式,但尝试和错误没有让我到任何地方。
答案 0 :(得分:1)
尝试删除NE
标记并使用B
:
RewriteCond %{REQUEST_URI}~%{QUERY_STRING} ^(.*?\/*)?(viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^(.+).php$ /?action=redirect&source=$1&%3 [R=301,L,B]
唯一的问题是%1
反向引用也会被编码,所以我把它排除在外。如果你必须在那里,你可以尝试两步重写:
RewriteCond %{REQUEST_URI}~%{QUERY_STRING} ^(.*?\/*)?(viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^(.+).php$ /special-rewrite-here?action=redirect&source=$1&%3 [L,B]
RewriteCond %{THE_REQUEST} ^[A-Z]+\ (.*?\/*)?(viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^special-rewrite-here$ /%1 [L,R=301]
答案 1 :(得分:1)
在Jon Lin的帮助下修复:
RewriteCond %{REQUEST_URI}~%{QUERY_STRING} ^(.*?\/*)? (viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^(.+).php$ /special-rewrite-here?action=redirect&source=$1&old_data=%3 [B]
RewriteCond %{REQUEST_URI}~%{QUERY_STRING} ^(.*?\/*)? (viewuser|viewstory|reviews|news)\.php~(.+)$ [NC]
RewriteRule ^/.+$ %1 [L,R=301]
我不得不再次使用RewriteCond来保存%1,并且不得不稍微修改第二个RewriteRule,但他确实让我走上了正确的轨道,所以:问题解决了,其余的将在PHP中发生,应该是没问题。