【问题标题】:Apache rewrite condition get second regex matchApache重写条件获得第二个正则表达式匹配
【发布时间】:2014-11-25 21:57:16
【问题描述】:

很抱歉在这里提出了第 100 万个 Apache 重写问题。我尝试了我所知道的一切,但有一个小步骤(希望是)我正在寻找可以为我照亮的人。

我有一个类似这样的 URL 结构:

 - assets
 - assets/dist/19854/css/my.css
 - css/my.css

我正在尝试将根目录中的assets/dist/19854/css/my.css file 重写为css/my.css 文件。

我在我的服务器上启用了 mod_rewrite,并且我对重写规则有基本的了解,但如果你能帮助我使用 Regex,那就太好了。

RewriteCond %{REQUEST_URI} ^assets/dist/([0-9/.]+)/(.*)$
RewriteRule ^assets/dist/([0-9]+)/(.*)$ $ [L,QSA]

上述规则的问题是它重写为./19854,但我实际上对第二个表达式的匹配感兴趣。如果可能的话,我还想确保 css/my.css 文件首先存在。

提前致谢!

编辑:

感谢 cmets 和答案。为了进一步解释我的情况,这是一个使用 CDN 的小型站点,每次构建新版本时,assets/dist/[0-9] 中的数字都会更改,因此所有资产的源 URL 都会更改。但是我使用 CSS 编译器来编译 CSS 文件,所以 CSS 文件位于同一个文件夹中 (css/my.css)。 我还有一些其他的重写,所以我让我的RewriteConds 更加严格。

到目前为止,上面的重写与数字部分匹配,但我试图在数字部分之后重写 URL。

【问题讨论】:

  • RewriteRule's 中的引用可以用 $1、$2 等来引用,RewriteCond's 中的引用可以用 %1、%2、%3 等来引用。为什么要这样做你有一个完全符合你的规则的 rewritecond 顺便说一句?
  • 我不得不使用严格的 RewriteCond 因为还有一些其他的重写,而这个重写只匹配网站的一小部分。我尝试使用 $1、2 等,但它们都给出相同的结果(在真实服务器中也是如此。上面的屏幕截图来自 martinmelin.se/rewrite-rule-tester
  • 那个测试仪坏了。使用$2 并在真实服务器上进行测试。
  • 你先生是救命恩人!我的RewriteCond 出现问题,导致重写无法在我的服务器中运行,并且一直以来,我都在为 $1、2 和 %s 苦苦挣扎。老实说,我不知道 % 和 $ 之间的区别。非常感谢您的智慧!

标签: regex apache mod-rewrite url-rewriting


【解决方案1】:

我相信你正在尝试另一种方式。您可以在 DOCUMENT_ROOT/.htaccess 文件中使用此代码:

RewriteEngine On
RewriteBase /

# route to /css/my.css if it exists
RewriteCond %{DOCUMENT_ROOT}/$1 -f [NC]
RewriteRule ^assets/dist/.+?/(css/my\.css)$ $1 [L,NC]

【讨论】:

  • 非常感谢@anubhava,但很抱歉我正在寻找一个稍微不同的。你能在我的新问题编辑中看到截图吗?我的RewriteRule 与第一个正则表达式匹配,但我正在尝试重写为第二个正则表达式。
  • 在您进行编辑之前,我就已经了解您使用 CDN 的要求。您在这里不需要RewriteCond。即使你使用它也必须是:RewriteCond %{REQUEST_URI} ^/assets/dist/([0-9/.]+)/(.*)$,带有前导斜杠。但正如我在回答中显示的那样,您不需要它。
  • 你说得对,实际上是糟糕的重写条件搞砸了我的测试。这个看起来也更干净。感谢您的回答,非常感谢。
猜你喜欢
  • 2019-03-13
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多