【问题标题】:RewriteRule for multiple URL matches in one line一行中多个 URL 匹配的 RewriteRule
【发布时间】:2015-07-01 20:31:01
【问题描述】:

我目前在我的 .htaccess 文件中使用以下行将几个子目录 URL 重写到我网站的根目录:

RewriteRule ^work(.*)$ $1
RewriteRule ^why-me(.*)$ $1
RewriteRule ^prices(.*)$ $1
RewriteRule ^contact(.*)$ $1

但是,有没有办法只用一行来表达这一点?

我试过了:

RewriteRule ^(work|why-me|prices|contact)(.*)$ $1

但是(不出所料,鉴于我对正则表达式完全缺乏了解),它不起作用并导致所有这些 URL 给我 404 错误。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:
    RewriteRule "^(work|why-me|prices|contact)(.*)$" "$2"
    

    RewriteRule "^(?:work|why-me|prices|contact)(.*)$" "$1"
    

    $1 指的是第一个捕获组,即您在第一组括号中定义的任何内容。由于您在括号中创建了另一个集合,$1 不再指代后面的内容,而是包含workwhy-me 等。

    第一个解决方案必须是 $2,因为 $1 将是以下之一:工作、为什么-我等,而 $2 将是它后面的任何内容。

    第二个解决方案通过对第一组使用非捕获组(它没有编号)来工作,因此(.*) 会将其放入 $1 而不是 $2。

    【讨论】:

      【解决方案2】:

      您可以使用非捕获组,因为$1 现在代表所有目录名称:

      RewriteRule ^(?:work|why-me|prices|contact)(.*)$ $1 [L,NC]
      

      【讨论】:

      • 我们怎样才能避免domainname/..;/manager/html url中的模式/..;/,在RewriteURL中使用正则表达式^/^((?!.;).)*,它只考虑第一个在 URI 查询字符串 (/..;/manager/html) 中出现模式。 RewriteRule ^/(.*) /app/$1 [PT] ,请提出建议。
      • @Prabha:请发布一个包含详细信息的问题,我会参加。
      • 您好,非常感谢,详情请查看网址:stackoverflow.com/questions/63742004/…
      猜你喜欢
      • 2014-03-03
      • 2018-02-07
      • 2013-01-13
      • 2014-09-16
      • 2014-01-29
      • 2013-07-15
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多