我有自己的 CMS 系统,其中包含多语言网站的设置,并将其保存在我的数据库中。但我无法在 htacces 中检查该变量,所以我想像这样检查我的请求网址:
cms2024.nl/nl/home 或 cms2024.nl/home,然后给出不同的 RewriteRules 以获得正确的 url 顺序
如果网址中有一种语言,我需要这些规则:
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)/$ /index.php?taal=$1&page=$2&title=$3&beginnenbij=$4 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/$ /index.php?taal=$1&page=$2&title=$3 [L]
RewriteRule ^([^/]*)/([^/]*)/$ /index.php?taal=$1&title=$2 [L]
否则:
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /index.php?page=$1&title=$2&beginnenbij=$3 [QSA,L]
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?page=$1&title=$2 [QSA,L]
RewriteRule ^([^/]+)/?$ /index.php?title=$1 [QSA,L]
如何在 htaccess 文件中检查此内容以获取正确的 url 构建?
您只需要一套规则。 (如果您可以在省略语言代码时使用“空”
taal
URL 参数 - 您应该这样做。)
([^/]*)
- 您需要更具体,并且检查您期望的特定(2 个字符?)语言代码,而不是在第一个(语言代码)路径段中检查 anything,例如。 (nl|en|id)
,或检查任何小写 2 字符路径段,例如。 ([a-z]{2})
,前提是不与page
冲突?然后将第一个路径段设为可选。
例如,一组规则可以处理这两种情况:
RewriteRule ^(?:([a-z]{2})/)?([^/]+)/([^/]+)/([^/]+)/$ /index.php?taal=$1&page=$2&title=$3&beginnenbij=$4 [L]
RewriteRule ^(?:([a-z]{2})/)?([^/]+)/([^/]+)/$ /index.php?taal=$1&page=$2&title=$3 [L]
RewriteRule ^(?:([a-z]{2})/)?([^/]+)/$ /index.php?taal=$1&title=$2 [L]
请注意,第一个路径段(包括第一个斜杠)是 可选,尾随
?
并且该组处于非捕获状态(由 (?:
前缀表示。但是,捕获语言的内部组code is 捕获。当省略语言代码时(即第一个路径段不是小写 2 个字符),则 $1
反向引用只是 empty,但仍然存在,因此以下反向引用不会重新编号.
另请注意,我将后续路径段的量词从
*
更改为 +
。在这里使用 *
没有多大意义,这使得它“看起来像”它允许 empty 路径段,例如。 /nl/foo//baz
- 无论如何都不会与第一个规则匹配,因为中间的双斜线在 RewriteRule
匹配的 URL 路径中被“解析掉”,因此 URL 将落入后面的规则无论如何。