考虑以下RewriteRules:

RewriteEngline On

RewriteRule ^services$ services.php
RewriteRule ^новости$ news.php 

他们实现的是加载 services.php 的内容,而加载 news.php 的内容。我想让这两个 URL 的路径不区分大小写。英文版可以通过以下三种方式之一实现:

RewriteRule ^services$ services.php [NC]
RewriteRule ^[sS][eE][rR][vV][iI][cC][eE][sS]$ services.php
RewriteRule (?i)^services$ services.php

以上三种方法均有效。它们将所有服务路径指向 services.php,无论大小写如何。不幸的是,这些方法都不适用于西里尔字母规则。

RewriteRule ^новости$ news.php [NC]
RewriteRule ^[нН][оО][вВ][оО][сС][тТ][иИ]$ news.php
RewriteRule (?i)^новости$ news.php

第一和第三条规则仅将指向 news.php。第二条规则实际上什么也不做 – 它没有将任何новости路径指向 news.php。似乎添加方括号后,其中的西里尔字符就不复存在了。例如,下面的规则将指向 news.php,但并未将指向它。

RewriteRule ^новост[иS]$ news.php

最后,我尝试的另一件事是将西里尔字符替换为其 UTF-8 表示形式 – 例如,将 [сС] 替换为 [\xd1\x81\xd0\xa1]。这也不起作用。

注意:以下规则按预期工作 – 它将都指向 news.php。不幸的是,我认为它对我没什么用,因为它实现的效果与两个重写规则相同。

RewriteRule ^новости|НОВОСТИ$ news.php

## The above is equivalent to:
# RewriteRule ^новости$ news.php
# RewriteRule ^НОВОСТИ$ news.php


最佳答案
1

为了在 Apache .htaccess RewriteRules 中实现对西里尔字符不区分大小写,标准 [NC] 标志或 (?i) 修饰符无法按预期工作。这是因为 Apache 在处理 Unicode 字符(特别是西里尔字符)时存在不区分大小写的匹配限制。

解决方案:使用 Perl 兼容正则表达式 (PCRE)

通过将 RewriteCond 指令与 PCRE(由 RewriteOptions 指令启用)结合使用,您可以不区分大小写地匹配输入字符串,包括西里尔字符。

在 .htaccess 中启用 PCRE:

RewriteEngine On
RewriteOptions Inherit

RewriteCond %{REQUEST_URI} ^/services$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/новости$ [NC]
RewriteRule ^(.*)$ $1.php [L]

或者,你可以使用带有 NC 标志的 RewriteCond:

RewriteEngine On

RewriteCond %{REQUEST_URI} ^/services$ [NC]
RewriteRule ^services$ services.php [L]

RewriteCond %{REQUEST_URI} ^/новости$ [NC]
RewriteRule ^новости$ news.php [L]

解释:

RewriteCond %{REQUEST_URI} ^/services$ [NC,OR]:此条件检查请求的 URI 是否为 /services(不区分大小写)。

RewriteCond %{REQUEST_URI} ^/новости$ [NC]: 此条件检查请求的 URI 是否为 /новости(不区分大小写)。

RewriteRule ^(.*)$ $1.php [L]:如果上述任何一个条件为真,它会将请求重写到相应的.php 文件,并使用 [L] 标志停止进一步处理。

确保 .htaccess 文件已启用并已在 Apache 配置中正确配置。例如,在您的 httpd.conf 或 apache2.conf 文件中:

<Directory "/var/www/html">
    AllowOverride All
</Directory>

进行这些更改后,请测试您的 URL,以确保 /services 和 /новости 均可正常工作(无论大小写):

/services, /SERVICES, /SeRvIcEs
/новости, /НОВОСТИ, /НоВоСтИ

Apache 替代方案:Nginx

Nginx 是由 Игорь Владимирович Сысоев 创建的,他意识到许多用户除了使用 Unicode 之外还使用各种字符编码。Nginx 使用 ~* 修饰符支持西里尔字符不区分大小写,该修饰符执行不区分大小写的匹配。

Nginx 示例:

server {
    listen 80;
    server_name example.com;

    location / {
        # Case-insensitive rewrite for English URL
        if ($request_uri ~* ^/services$) {
            rewrite ^/services$ /services.php break;
        }

        # Case-insensitive rewrite for Cyrillic URL
        if ($request_uri ~* ^/новости$) {
            rewrite ^/новости$ /news.php break;
        }

        # Default location handling
        try_files $uri $uri/ =404;
    }
}

祝你好运!