多个 RewriteConds / RewriteRules 取决于单个规则目标的文件存在

Multiple RewriteConds / RewriteRules depending on file existence of single rule targets

我目前正在一个静态网站上工作,我需要将最后一个 URI 元素作为查询参数传递给某些页面

我所有的静态 html 页面都在 /pages/**/* 目录中,其中的路径与最终网站上的所需路径直接相关。意思是 /products/kitchen 需要显示 /pages/products/kitchen.html。如果在此示例中,文件 /pages/products/kitchen.html 不存在,我想尝试 /pages/products.html 并将 kitchen 作为名为 id 的查询参数传递(?id=kitchen). /assets 目录中有静态资源,因此根本不应将存在的文件重写到 /pages 目录中。如果没有请求的路径,我想重定向到默认主页。 probe.json 规则用于 kubernetes 集群中的 liveliness-checks,我只是把它放在那里因为我不能 100% 确定它不是罪魁祸首。

我试图以 if > else if > else if > else 的方式将多个 RewriteCondRewriteRule 链接在一起,但这似乎在某些时候失败了。不幸的是,这些错误调试起来非常棘手,因为除了浏览器 404-error 之外,没有任何迹象表明发生了什么。目前,只有现有文件和默认页面的规则可以正常工作。对我做错的任何帮助将不胜感激!

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .? - [L]

<files probe.json>
    order allow,deny
    allow from all
</files>

RewriteCond pages/.html -f
RewriteRule ^(.*)$ pages/.html [NC,L]

RewriteCond pages/.html -f
RewriteRule ^(.*(?=[/]))/(.*)$ pages/.html?id= [NC,L]

RewriteRule ^$ pages/home.html [L]

我找到了这个问题的解决方案。

  1. 我不得不使用绝对路径。

  2. 我必须在条件前面添加 %{DOCUMENT_ROOT}

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .? - [L]

<files probe.json>
    order allow,deny
    allow from all
</files>

RewriteCond %{DOCUMENT_ROOT}/pages/.html -f
RewriteRule ^(.*)$ /pages/.html [NC,L]

RewriteCond %{DOCUMENT_ROOT}/pages/.html -f
RewriteRule ^(.*(?=[/]))/(.*)$ /pages/.html?id= [NC,L]

RewriteRule ^$ /pages/home.html [L]