长话短说,我想同时有example.com/aJ5和example.com/any-other-url一起工作。 我使用的是Apache,不擅长编写正则expression式。
我已经有一个全局的RewriteRule ,它将所有的东西都发送到应用程序入口点。 我需要的是告诉Apache if length($path) is <= 5 chars然后重写到另一个位置。
我知道我可以在正则expression式中使用{1,5}类似的语法,但是并不真正知道它是我正在寻找的。
我想实现这个在Web服务器级而不是PHP级别。 任何帮助表示赞赏。
如果您可以假设-字符不会被包含在短url中:
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]){1,5} RewriteRule ^ /app-entry-point?url=%1 [L]
这是未经testing,但这样的事情应该工作。 如果REQUEST_URI类似于/abc12 ,那么基本上你会传递一个条件,控制切换到你想要的任何处理器。 它将跳过超过5个字符的URL,或者包含“slug”字符“ – ”或下划线。
%1 ,最后一个RewriteCond反向引用,将被扩展到短URL。 把这个放在你的其他规则的上面来强制执行这个 – 用[L]标志它将停止重写URL并把控制权交给应用程序。
RewriteCond %{REQUEST_URI} ^/.{1,5}$ RewriteRule ...
这将匹配1到5个字符之间的任何请求,并运行以下RewriteRule。 任何时间,那么将不会运行RewriteRule。 REQUEST_URIvariables是浏览器传递给Web服务器的东西。 同样的可以在一个单独的RewriteRule中处理,但是如果你需要的话,上面的代码就可以链接了。
^/.{1,5}$
^ =匹配string的开头
/ =只是匹配一个正斜杠
。 =匹配任何不是换行符的字符
{1,5} =通知regex引擎匹配前一个字符1-5次
$ =匹配行尾字符
/.{1,5}$结构告诉正则expression式引擎匹配任何紧随行结尾字符并紧跟在/前面的大小为1-5的string。