【问题标题】:Matching a regex containing variable environment in RewriteCond of .htaccess在 .htaccess 的 RewriteCond 中匹配包含变量环境的正则表达式
【发布时间】:2022-09-23 16:28:16
【问题描述】:

这里的目标是如果 URL 有一个尾部斜杠,例如 h2tps://domain.com/page/,则重定向到 h2tps://domain.com/page

h2tp(s)://(www.)domaine.com/page/ => h2tps://domain.com/page

它应该只在 prod 环境中工作,而不是在 dev 环境中,这就是为什么这个条件必须只适用于 domain.com。 domain.com 被设置为一个变量,以便在更复杂的环境中进行简单的配置。

实际上,这是我的 .htaccess :

RewriteEngine on
RewriteBase /

RewriteRule .* - [E=DOMAIN:domain.com]

# Remove ending / AND rewrite with https and without www in a single redirection
RewriteCond expr \"%{HTTP_HOST} -strmatch \'(www\\.)?%{ENV:DOMAIN}\'\" [NC]
RewriteCond %{REQUEST_URI} /public/(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) https://%{ENV:DOMAIN}/%1 [R=301,L]

我试过在表达式中使用 -strmatch 和 = 。事实是 h2tps://domain.com/page/ 重定向,而不是 h2tps://www.domain.om/page/,好像是可选的 (www.)?被忽略了。

我需要这方面的帮助!

  • -strmatch 不进行正则表达式匹配,它是字符串匹配,支持一些通配符(*、?、[] - 但与正则表达式中的含义不同。)
  • 您的.htaccess 文件在哪里?您在第二个中引用了 /public/... URL-path(健康)状况,但这在您的示例 URL 中不存在? (您是否可能将来自父目录的请求重写为/public?)上述规则不会重定向任何内容 - 如果您看到重定向,那么这很可能是缓存重定向(301 - 永久 - 重定向被永久缓存由浏览器和可能的中间缓存)。
  • public/ 没问题,它是实际 .htaccess 的位置(根网站中还有一个重定向到 public/ 的位置。我找到了解决方案,我会在几个小时后发布。谢谢!

标签: regex .htaccess mod-rewrite environment-variables expr


【解决方案1】:

所以,感谢CBroe的第一条评论,我来到了这个解决方案:

RewriteCond expr "%{HTTP_HOST} -strcmatch '*%{ENV:DOMAIN}'"

* 字符是通配符,表示任何字符,包括无字符。 'www.domain.com' 和 'domain.com' 匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多