使用mod_rewrite的未混淆的URL

时间:2009-10-29 15:57:31

标签: mod-rewrite obfuscation

我为一家公司工作,该公司过去常常会为您需要注册使用的文章提供混淆的网址。所以他们会有像

这样的东西

/story.php?story_id=Z_ZXYZ

有一些代码将字母映射到数字以计算出真实的故事ID

所以

Z = 0 
Y = 1
X = 2 

我们现在正在移动技术堆栈,并决定不需要混淆的网址。所以我正在研究是否可以使用mod rewrite

来模糊URL

到目前为止我已经

  RewriteCond %{REQUEST_URI} ^.*story.php [NC]
  RewriteCond %{QUERY_STRING} ^.*story_id=Z_([ZXYWVUTSRQ]*) [NC]
  RewriteRule ^.*$ /story/${decryptmap:%1} [L,R=301]

我在httpd.conf文件中有一个重写映射

<IfModule mod_rewrite.c>
  RewriteMap decryptmap txt:decyrpsdstxt
</IfModule>

哪个有内容

##
## decrypt urls
##
Z 0
X 1

等。

但它似乎无法正常工作,即使我在Rewriterule中添加了一些文字RewriteRule ^.*$ /story/${decryptmap:ZXY} [L,R=301]我得到的网址如/story/?story_id=Z_ZAD

有什么明显我做错了吗?我可以看到这两个条件正在匹配,但地图似乎不起作用。

我是否应该尝试使用mod重写来执行此操作?我可以重定向到一个相当容易做到这一点的脚本,但这会将重定向代码放在两个我不喜欢的地方。

(我不担心?story_id = Z_ZAD,我知道如何摆脱它)

1 个答案:

答案 0 :(得分:1)

重写映射可以使用已传递的整个字符串。因此,在您的情况下,您需要一次只传递一个字符:

# put story_id at the begin for efficiency
RewriteCond %{QUERY_STRING} ^(([^&]*&)+)(story_id=Z_[^&]*)&*(.*)$
RewriteRule ^story\.php$ story.php?%3&%1%4

# decrypt story_id value character by character
RewriteCond %{QUERY_STRING} ^story_id=Z_([^ZXYWVUTSRQ]*)([ZXYWVUTSRQ])(.*)
RewriteRule ^story\.php$ story.php?story_id=Z_%1${decryptmap:%2}%3 [N]

# redirect
RewriteCond %{QUERY_STRING} ^story_id=Z_([^&])&*(.*)
RewriteRule ^story\.php$ /story/%1?%2 [L,R=301]