【问题标题】:Intermittent RewriteRule间歇重写规则
【发布时间】:2021-07-24 07:24:49
【问题描述】:

这是我在 .htaccess 中的重写规则:

RewriteRule ^quiz/([A-Za-z0-9-]+)/([0-9-]+)/?$ quiz/index.php?inv=$1&d=$2 [NC,L]

它非常适合这些 URL,它们有多种大小写,有和没有连字符,并且都带有最后一段的日期:

http://localhost/quiz/C-PFM/2021-04-30/

http://localhost/quiz/cpf-o/2021-04-30/

http://localhost/quiz/ipa/2021-04-30/

http://localhost/quiz/ipacsc/2021-04-30/

http://localhost/quiz/uob-sp/2021-04-30/

http://localhost/quiz/uobsp/2021-04-30/

http://localhost/quiz/Hol-V/2021-04-30/

http://localhost/quiz/HOLVA/2021-04-30/

也就是说,$_GET 正确返回例如

inv=HOLVA; d=2021-04-30

正如预期的那样。

但是,对于这些示例中的每一个,相同的规则都失败(返回 404),这些示例还混合了大小写,有些带有连字符,有些没有:

http://localhost/quiz/CPFM/2021-04-30/

http://localhost/quiz/cpfo/2021-04-30/

http://localhost/quiz/ipac-sc/2021-04-30/

http://localhost/quiz/GLD10US/2021-04-30/

http://localhost/quiz/HolV/2021-04-30/

http://localhost/quiz/OCBCC/2021-04-30/

http://localhost/quiz/PP/2021-04-30/

可以通过在随机位置添加连字符来使一些失败的部分正常工作。实际上,我确实尝试过像这样逃避规则中的连字符,但似乎没有什么不同:

RewriteRule ^quiz/([A-Za-z0-9\-]+)/([0-9\-]+)/?$ quiz/index.php?inv=$1&d=$2    [NC,L]

我还尝试删除 NC 或整个 [NC,L],但没有任何区别。

在第一个 [ ] 块之后,我还尝试了 +*,但这并没有什么不同。

.htaccess 文件没有其他可能发生冲突的相关规则。

为什么不工作的不工作?

TIA

【问题讨论】:

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


    【解决方案1】:

    你也可以尝试一个否定字符类,比如[^/],它匹配除/之外的任何字符。:

    Options -MultiViews
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(quiz)/([^/]+)/([^/]+)/?$ $1/index.php?inv=$1&id=$2 [NC,L,QSA]
    

    这假设quiz/ 文件夹内没有.htaccess。你可以在quiz/.htaccess里面试试这个规则:

    Options -MultiViews
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]+)/?$ index.php?inv=$1&id=$2 [L,QSA]
    

    【讨论】:

    • 你好阿努巴瓦。谢谢您的建议。请参阅我对 RavinderSingh13 答案的最终评论。原来是缓存问题。咕噜。
    【解决方案2】:

    使用您显示的示例/尝试,您能否尝试以下操作。请确保在测试您的 URL 之前清除您的浏览器缓存。

    RewriteEngine ON
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(quiz)/([\w-]+)/(\d{4}(?:-\d{2}){2})/?$ $1/index.php?inv=$1&id=$2 [NC,L]
    

    【讨论】:

    • 谢谢,但行为是一样的。我还尝试了一个变量(没有日期),例如 RewriteRule ^quiz/([A-Za-z0-9\-]+)/?$ quiz/index.php?inv=$1非工作的仍然没有。所以日期部分不会影响事情。
    • @MBourne,能否请您给我 1 个它不起作用的示例 url?谢谢。
    • 感谢您的帮助。我最初的问题有 7 个示例,这些示例不起作用并且仍然不符合您建议的规则。适用于您建议的规则的原始规则。
    • 解决了。我的 index.php 实际上涉及在服务器上创建 .png 图像。结果我的文件的早期版本(它只生成图像,而不是作为 HTML 页面的一部分)仍然在缓存中,即使我使用了 3 种不同的浏览器并且我清除了每个浏览器的缓存。很烦人。我现在终于能够把事情弄清楚了,它现在按预期工作。非常感谢您的帮助!
    • “清除浏览器缓存”是最终成功的建议。对于以后遇到此问题的任何人,所有 3 种方法(我的原始方法、anubhava 方法和您的方法)都可以使用。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2010-11-20
    • 2012-11-21
    • 2010-11-13
    相关资源
    最近更新 更多