0

好的,所以我一直在尝试围绕(我相信是)一个简单的 mod_rewrite 案例。也许不是,但我希望你能帮助我,Stack Overflow。

所以我想要的是:有几个文件夹需要被忽略(即“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 错误。

有人可以帮帮我吗?

4

2 回答 2

0

你需要重复这个条件。ARewriteCond仅适用于紧随其后的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]
于 2013-08-02T03:27:54.443 回答
0

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

尤其如此,因为现在任何六个字母的 URI 都将被默认。如果你有一个类似的控制器example.com/bloggers怎么办?它总是被认为是一个下载项目,即使它是一个真正的控制器 URI。

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


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

^([a-zA-Z0-9]{6})$

这个正则表达式可以用作 CodeIgniter 路线,如果你走那条路线(呵呵)。只需删除^$开始/结束字符,因为 CI 会将它们放在那里。

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

于 2013-08-02T05:35:45.060 回答