【问题标题】:Htaccess Match Random 6 characters, with exceptions?Htaccess 匹配随机 6 个字符,有例外吗?
【发布时间】:2013-08-02 13:35:45
【问题描述】:

好的,所以我一直试图围绕(我相信是)一个简单的 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 错误。

有人可以帮帮我吗?

【问题讨论】:

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

标签: apache codeigniter .htaccess mod-rewrite


【解决方案1】:

您需要重复条件。 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]

【讨论】:

    【解决方案2】:

    你应该让 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。一个之后,条件重置。

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多