【问题标题】:mod rewrite helpmod重写帮助
【发布时间】:2011-07-25 00:26:24
【问题描述】:

我正在尝试使用 mod rewrite 来删除和替换我的部分网址。我希望我的网址看起来像这样。

http://domain.com/e813c697e8dd8dc2bbfecb1d20b15783.html

而不是

http://domain.com/lookup.php?md5=e813c697e8dd8dc2bbfecb1d20b15783

lookup.php 调用将 md5 匹配到数据库并获取并将您转发到正确的 url。 我现在需要做的就是重写它,以便它从此重写

http://domain.com/lookup.php?md5=e813c697e8dd8dc2bbfecb1d20b15783

到这里

http://domain.com/e813c697e8dd8dc2bbfecb1d20b15783.html

我已经尝试过这种方法,但它会在根级别从任何 .html 页面进行重写,并且不会显示任何“空白”。

RewriteRule ^([a-z0-9]+)\.html$ /lookup.php?md5=$1 

谁能告诉我一种方法来做到这一点,这样我的常规 html 页面就不会被弄乱,并且能够以我想要的方式显示这些链接?谢谢。

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    您当前的规则过于宽泛。您需要更具体地只匹配 md5 哈希值——这很容易:

    RewriteRule ^([a-f0-9]{32})\.html$ /lookup.php?md5=$1 [QSA,L]
    
    1. 您的文件名模式过于宽泛——它将匹配任何包含字母和数字的文件。另一方面,md5 哈希使用非常有限的字符子集(仅限a-f)和数字.. 并且必须是 32 个字符长。这种模式([a-f0-9]{32}) 完美地完成了这项工作。

    2. 我还添加了LQSA 标志(QSA 以保留任何现有的查询字符串(例如,跟踪信息)和L 以停止匹配任何其他规则)。

    3. 为了进一步确保它不匹配任何可能具有这种格式名称的真实文件(谁知道),请在规则前添加RewriteCond %{REQUEST_FILENAME} !-f 行。

    【讨论】:

      【解决方案2】:

      您可以做的一件事是量化十六进制数字的数量:

      RewriteRule ^([0-9a-f]{32})\.html$ /lookup.php?md5=$1 
      

      因为 md5 总是有 32 个十六进制数字。

      【讨论】:

      • 您的模式中有额外的]。否则:+1
      【解决方案3】:

      这取决于常规 html 页面的命名方案。对于初学者,尽管您可以将其更改为:RewriteRule ^([a-f0-9]+)\.html$ /lookup.php?md5=$1

      这将使任何字母不在af 之间的html 页面工作。

      如果您的 HTML 页面的名称中没有数字,并且页面不重定向的成本超过了 md5 哈希中没有数字的可能性。您可以检查文件名中是否至少有一位数字:RewriteRule ^([a-f]*\d[a-f\d]+)\.html$ /lookup.php?md5=$1

      最后,如果您可以接受http://domain.com/md5/e813c697e8dd8dc2bbfecb1d20b15783.html 之类的网址,则可以将其更改为:RewriteRule ^md5/([a-f0-9]+)\.html$ /lookup.php?md5=$1,而不必担心其他方法的脆弱性。

      我不确定,但从你的示例 mod_rewrite 判断,我认为你的 .htaccess 中某处有一个 RewriteBase /。如果不是,您可能需要在您选择使用的任何 RewriteRule 中的 ^ 之后添加一个 /

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多