检查 REQUEST_URI 中是否有 /nl/ 或 /en/ 来更改我的重写规则

问题描述 投票:0回答:1

我有自己的 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 构建?

php .htaccess content-management-system
1个回答
0
投票

您只需要一套规则。 (如果您可以在省略语言代码时使用“空”

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 将落入后面的规则无论如何。

© www.soinside.com 2019 - 2024. All rights reserved.