使用mod_rewrite缩短网址

时间:2012-12-16 00:30:44

标签: apache .htaccess mod-rewrite

我目前正在尝试为其中一个项目制作网址缩短功能;如果用户使用不包含任何斜杠(对于目录)或文件扩展名的URL访问该站点,我想要做的是,它应该重定向到将提供正确文件的PHP脚本。例如:

http://example.com/A123将被重写为http://example.com/view.php?id=A123

http://example.com/A123/不会被重写,而且 http://example.com/A123.png也不会被重写。我一直在搞乱mod_rewrite几个小时,而对于我的生活,我无法让它工作......

2 个答案:

答案 0 :(得分:2)

无法识别需要缩短的URI,您需要排除所有其他可能性。这可能需要您构建冗长的排除列表。以下是一个起点。这些条件中的每一个都验证请求的URI不匹配(由!表示)。如果它与所有条件都不匹配,则运行规则。

RewriteCond %{REQUEST_URI} !^/view.php
RewriteCond %{REQUEST_URI} !.html$
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^/(.*)$ http://example.com/view.php?id=$1 [QSA]

以上还要求您(按照您的要求)打破标准练习规则,即处理没有尾部斜杠的目录请求。您可能会遇到其他问题,因为上述规则会破坏您的Apache服务器端目录规则。

重新思考逻辑。如果您有某种方法来识别要缩短的URL,那将更容易。例如's',http://example.com/s/A123

RewriteCond %{REQUEST_URI} ^/s/
RewriteRule ^/s/(.*)$ http://example.com/view.php?id=$1 [QSA]

答案 1 :(得分:0)

我绝对不是这个大师,但它与我想要完成的事情类似(see my yet unanswered question

但是,如果我理解正确,这个(未经测试的)RewriteRule可能有效:

RewriteRule ^([^\.\/]*)$ view.php?id=$1 [L]

magic 部分是[^\.\/]*,它表示:一个或多个(*)字符的实例([])不是({{{ 1}})句号或斜线([^ ]逃脱这些特征。)

就像我说的那样,我没有测试过,我也不是专家,但也许这会有所帮助。