在RewriteRule中转义字符串

时间:2014-08-08 18:56:33

标签: apache .htaccess mod-rewrite

我目前正在咀嚼这个问题:我正在改造一种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
  • 中的%3定义的整个部分

如果你想知道,问号需要使用RewriteCond,无法让它以任何其他方式工作,所以摆脱它的任何解决方案都是受欢迎的。

好吧,谢谢你调查,甚至可能对事物有所了解,我只是进入了整个正则表达式的事情,但还没有完全弄清楚变量是如何从链接的RewriteRule传递到另一个,也许本来就是得到的方式,但尝试和错误没有让我到任何地方。

2 个答案:

答案 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中发生,应该是没问题。