2009-10-29 39 views
0

我曾经为一家公司工作,该公司曾经为需要注册才能使用的文章模糊URL。因此,他们将不得不像使用mod重写的无法混淆网址

/story.php?story_id=Z_ZXYZ

其中有一些代码,映射字母与数字制定出真实的故事ID

所以

Z = 0 
Y = 1 
X = 2 

我们现在正在移动技术堆栈,并已决定不需要混淆的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 ^.*$ /story/${decryptmap:ZXY} [L,R=301]我得到像/story/?story_id=Z_ZAD

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

我应该甚至试图让mod重写来做到这一点?我可以重定向到一个很容易做到这一点的脚本,但是这会将代码重定向到两个我不喜欢的地方。

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

回答

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] 
+1

或者,他可以利用脚本,将刚才得到的地图,用正确的URL配对,如果mod_rewrite的是行不通的。 – dusoft 2009-10-29 16:40:26

+0

@dusoft:是的,绝对。事实上,重写映射类型'txt'使用线性搜索,因此O(n)。但十个项目不是问题。对于大量的项目,类型'dbm'是一个更好的选择,因为它是通过哈希映射(O(1))实现的。 – Gumbo 2009-10-29 16:48:13

+0

我得到这个工作,在每个阶段使用301重定向我认为我的其他一些规则打破了它。 – 2009-11-04 14:45:40