【问题标题】:How to rewrite URL according to a condition?如何根据条件重写 URL?
【发布时间】:2021-04-09 16:38:24
【问题描述】:

我试图在 Apache 中编辑 URL,如下所述,但我没有成功。

如果 URI 以字母“a”开头且第三个数字不是“7”且总数字为 6 那么 url http://example.com/a/123456/ 应该重写为 http://example.com/sixdigits.php

如果 URI 以字母“b”开头,并且第三个数字不是“7”且总数字为 4,则 url http://example.com/b/1234/ 应重写为 http://example.com/fourdigits.php

这是我对 .htaccess 文件的尝试。

RewriteRule ^a/[0-9]+/$  sixdigits.php 
RewriteRule ^b/[0-9]+/$  fourdigits.php

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting friendly-url


    【解决方案1】:

    另一个正则表达式变体:

    RewriteEngine On
    
    RewriteRule ^a/\d{2}[^7\D]\d{3}/?$ sixdigits.php [L]
    
    RewriteRule ^b/\d{2}[^7\D]\d/?$ fourdigits.php [L]
    
    • [^7\D] 将匹配除 7 之外的任何数字

    【讨论】:

      【解决方案2】:

      您能否尝试使用所示示例进行以下、编写和测试。请确保在测试 URL 之前清除浏览器缓存。

      RewriteEngine ON
      RewriteRule ^a/([0-9]{2})([012345689])([0-9]{3})/?$ sixdigits.php [NC,L]
      RewriteRule ^b/([0-9]{2})([012345689])([0-9])/?$  fourdigits.php [NC,L]
      

      【讨论】:

        【解决方案3】:

        你可以使用:

        • [^7] 表示NOT 7
        • \d 表示[0-9]
        • {2}等表示two of the preceding character

        因此:

        如果 URI 以字母 a 开头并且第三个数字不是 7 总位数为 6,则 url http://example.com/a/123456/ 应为 改写为http://example.com/sixdigits.php

        RewriteRule ^a/\d{2}[^7]\d{3}/?$  sixdigits.php
        

        如果 URI 以字母 b 开头且第三个数字不是 7 与 总位数为 4,则 url http://example.com/a/1234/ 应为 改写为http://example.com/fourdigits.php

        RewriteRule ^b/\d{2}[^7]\d/?$  fourdigits.php
        

        【讨论】:

        • 抱歉,[^7] 不适合匹配 一个非 7 的数字
        • @arkascha 啊哈。你是说字符7和数字7有区别吗?
        • 没有。这不是我要说的。您的模式接受除“7”之外的任何字符,但 OP 只想接受除“7”之外的数字。那是不同的东西。例如,您接受不是 OP 想要的字母。
        • 我不同意。不是因为这样的 URL 被请求的可能性(我们都对此一无所知...)。但是因为您的模式使实现难以维护。它没有实现预期的目标。这从来都不是一个好主意。但那只是我的 2 美分……
        • @arkascha 我认为你的意见是完全正确的。我认为用[012345689] 替换[^7] 是一个很好的例子。我还认为,稍后,粗心的后续编码人员可能会将后者误读为 [0123456789] 并错误地将其优化为 [0-9][\d](他们在阅读 [^7] 时不太可能犯的错误)但我承认你确实提出了重要的问题。
        猜你喜欢
        • 2012-07-19
        • 2014-01-25
        • 2021-09-15
        • 2011-05-23
        • 2020-11-08
        • 2021-06-29
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        相关资源
        最近更新 更多