Apache Htaccess随机匹配6个字符,是否有例外?

Apache Htaccess随机匹配6个字符,是否有例外?,apache,codeigniter,.htaccess,mod-rewrite,Apache,Codeigniter,.htaccess,Mod Rewrite,好吧,所以我一直在尝试(我相信是)一个简单的mod_重写案例。也许不是,但我希望你能帮我,堆栈溢出 所以我想要的是:有几个文件夹需要忽略(例如,“css”、“js”、“bootstrap”等等)。如果url字符串与这些不匹配,我想检查它是否是由六个字母和数字组成的字符串,并将其重定向到一个url。否则,它将被重定向到另一个url 这就是我所拥有的: RewriteCond %{REQUEST_URI} !^/(index\.php|images|robots\.txt|bootstrap|php

好吧,所以我一直在尝试(我相信是)一个简单的mod_重写案例。也许不是,但我希望你能帮我,堆栈溢出

所以我想要的是:有几个文件夹需要忽略(例如,“css”、“js”、“bootstrap”等等)。如果url字符串与这些不匹配,我想检查它是否是由六个字母和数字组成的字符串,并将其重定向到一个url。否则,它将被重定向到另一个url

这就是我所拥有的:

RewriteCond %{REQUEST_URI} !^/(index\.php|images|robots\.txt|bootstrap|phpmyadmin|css|js|font|recaptchalib.php|uploads)/
RewriteRule ^(a-z0-9+){6}$ /index.php/download/index/$1 [L]
RewriteRule ^(.*)$ /index.php/$1 [L]
如果我去掉中间的一行,它可以正常工作,除了我没有“匹配6个随机字符”功能。在中间这一行,我每一页都有500个错误


有人能帮我一下吗?

你需要重复这个条件。
RewriteCond
仅适用于紧跟其后的
RewriteRule
。所以,第二条规则并不排除您在您的条件下所拥有的模式中的所有文件夹。尝试:

RewriteCond %{REQUEST_URI} !^/(index\.php|images|robots\.txt|bootstrap|phpmyadmin|css|js|font|recaptchalib.php|uploads)/
RewriteRule ^(a-z0-9+){6}$ /index.php/download/index/$1 [L]

RewriteCond %{REQUEST_URI} !^/(index\.php|images|robots\.txt|bootstrap|phpmyadmin|css|js|font|recaptchalib.php|uploads)/
RewriteRule ^(.*)$ /index.php/$1 [L]

您应该让CodeIgniter来处理这个问题。保留您的.htaccess以路由到index.php前端控制器,并使用路由来处理URI以及它应该从那里转到哪里

这尤其正确,因为现在任何六个字母的URI都将被默认。如果你有一个像
example.com/bloggers
这样的控制器会怎么样?它将始终被假定为一个下载项,即使它是一个真正的控制器URI

“最简单”的选项(读:与现有控制器/路由不冲突的选项)是利用
404_控制器
检查URI并查看它是否是有效的下载URL。然后可以运行相应的代码


解释.htaccess代码不起作用的可能原因:匹配六个字母数字字符的正则表达式是错误的。以下是您需要的:

^([a-zA-Z0-9]{6})$
这个正则表达式也可以用作CodeIgniter路径,如果您选择该路径(呵呵)。只要删除
^$
开头/结尾字符,因为CI会将它们放在那里


正如Jon Lin所提到的,您还需要复制
RewriteCond
条件,因为它们只适用于一个
RewriteRule
。在一个字符之后,条件重置。

我不确定htaccess,但是几乎所有的范围都应该这样定义([a-z0-9]+),如果你想要精确的6个字符,你不需要在范围附近加上+,所以它应该类似于([a-z0-9]{6})