【问题标题】:How to handle RewriteRules when the word has similar first characters?当单词具有相似的第一个字符时如何处理 RewriteRules?
【发布时间】:2017-04-14 16:51:39
【问题描述】:

我已经尝试了一个小时来解决这个问题,但是,我的一个重定向总是不起作用。我有路径something.com/blog/article-name 和something.com/blogujeme 作为文章列表。但是我无法让这两个重定向工作,因为它们共享相同的第一个字符并且正则表达式让我失败。到目前为止,我想出的是:

RewriteRule ^(?!blog\?)(blogujeme)$ blog/category-view.php
RewriteRule ^(?!blogujeme\?)(blog) blog/page-view.php

第一个重写规则确实有效,但第二个无效并重定向到something.com/blog 而不是something.com/blogujeme

我做错了什么?

【问题讨论】:

  • @WiktorStribiżew 是的,但这几乎不能解决我的问题,重定向仍然不起作用

标签: regex mod-rewrite url-rewriting


【解决方案1】:

“你在做什么错”的最简单答案是不要使用 [L] 作为 mod_rewrite 到 STOP 的指示符,并在匹配时感到满意。

按照最具体的最先出现的顺序排列您的“相似”正则表达式。如果命中并且最后有一个 [L],那么将不再运行任何规则。

如果没有命中,将尝试下一个。因此它们可以看作 “如果,如果,如果,等等。”

【讨论】:

    【解决方案2】:

    但我无法处理这两个重定向,因为它们共享相同 第一个字符和正则表达式让我失望

    您应该不对正则表达式有任何类似的问题,因为您的 2 个示例可以区分。实际上,您的问题是关于 mod_rewrite 规则语法/语义。

    这是您需要在 htaccess 中写入的内容(在这种情况下必须在根文件夹中)

    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f # prevent from infinite loop
    RewriteRule ^blog/.+$ blog/page-view.php [L]
    
    RewriteRule ^blogujeme$ blog/category-view.php [L]
    

    【讨论】:

    • 抱歉,误点击了downvote,直到它被锁定后才意识到。
    • 这是最正确最彻底的答案,获得赏金
    【解决方案3】:

    您可以使用正则表达式和一些 Apache mod_rewrite 指令来实现您想要的。您必须使用条件来检查请求是否是文件,如果是,则处理文件而不是继续执行规则:

    RewriteEngine on
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^blog/.*$ blog/page-view.php [L]
    RewriteRule ^blogujeme$ blog/category-view.php [L]
    

    那么你将拥有:

    /blog -> blog/page-view.php
    /blogujeme -> blog/category-view.php
    /blog/page-view.php -> blog/page-view.php
    /blog/category-view.php -> blog/category-view.php
    

    【讨论】:

      【解决方案4】:

      从臀部射击 - 单词边界锚怎么样?

      RewriteRule \bblogujeme$ blog/category-view.php
      RewriteRule \bblog\b.* blog/page-view.php
      

      【讨论】:

      • 无效,结果相同。这真的让我很痛苦。最简单的可能是为这两个页面使用完全不同的词,但也许有人会想出一些东西
      • 我不熟悉 URL 重写,但在我看来,您的开始和结束锚点(^ 和 $)不正确。尝试修改后的正则表达式。 (做一些谷歌搜索我看起来取决于RewriteBase - 对吗?也许应该是一个起始锚(^)而不是斜线\/...)
      • 在this site 上进行测试,看来RewriteRule \bblogujeme$ blog/category-view.php 和RewriteRule \bblog\b.* blog/page-view.php 可能会为您做到这一点。更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多