我目前正在尝试为其中一个项目制作网址缩短功能;如果用户使用不包含任何斜杠(对于目录)或文件扩展名的URL访问该站点,我想要做的是,它应该重定向到将提供正确文件的PHP脚本。例如:
http://example.com/A123将被重写为http://example.com/view.php?id=A123
但 http://example.com/A123/不会被重写,而且 http://example.com/A123.png也不会被重写。我一直在搞乱mod_rewrite几个小时,而对于我的生活,我无法让它工作......
答案 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}})句号或斜线([^ ]
逃脱这些特征。)
就像我说的那样,我没有测试过,我也不是专家,但也许这会有所帮助。