【问题标题】:Un obfuscate URL using mod rewrite使用 mod rewrite 取消混淆 URL
【发布时间】:2009-10-29 15:57:30
【问题描述】:

我在一家公司工作,该公司曾经对您需要注册才能使用的文章的 URL 进行混淆处理。所以他们会有类似的东西

/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,我知道如何摆脱它)

【问题讨论】:

    标签: mod-rewrite obfuscation


    【解决方案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]
    

    【讨论】:

    • 或者,如果 mod_rewrite 不起作用,他可以使用脚本来获取地图并将其与正确的 URL 配对。
    • @dusoft:是的,当然。事实上,重写映射类型txt 使用线性搜索,因此 O(n)。但是十个项目不是问题。对于大量的项目,dbm 类型是更好的选择,因为它是使用哈希映射 (O(1)) 实现的。
    • 我在每个阶段都使用 301 重定向来实现这一点,我认为我的其他一些规则正在破坏它。
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多