我为一家公司工作,该公司过去常常会为您需要注册使用的文章提供混淆的网址。所以他们会有像
这样的东西/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,我知道如何摆脱它)
答案 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]