使用 apache mod_rewrite 将带连字符的 URL 重写为 pascal 大小写

Rewrite hyphenated URL to pascal case using apache mod_rewrite

用户 friendly URLs 应该用连字符连接,例如:

http://example.com/some-category/some-file

然而,我继承的文件夹结构是 Pascal 大小写的,因此 重写的 URL 应该如下所示:

http://example.com/SomeCategory/SomeFile.php

注意:类别或文件名中的单词数量会有所不同,因此不要指望以这种方式保持一致。前任。 http://example.com/some-long-category/file.

我想知道如何使用 Apache 的 mod_rewrite.

对任何类别和文件进行通用重写条件规则对

您可以测试您的规则here,而无需设置 Apache 服务器。

请注意,该问题已在撰写此答案后更新,并且最初并未声明它不是一致的格式 - 此答案涵盖 word-word/word-word

这部分需要在您的主服务器配置中,在根级别或 <VirtualHost>:

RewriteEngine on
RewriteMap uc int:toupper

那么你的 .htaccess:

RewriteEngine on
RewriteRule ([a-z])([a-z]*)-([a-z])([a-z]*)/([a-z])([a-z]*)-([a-z])([a-z]*) %{uc:}%{uc:}/%{uc:}%{uc:}.php

我相信重写引擎不需要在第一个中打开,但为了确定已经打开了。我会把测试留给你。我已经完成了足够多的工作!无论如何都无法在那里进行测试,因为它需要设置第一部分。

它将重定向四个单词位置中任何一个的单个字母。假设所有格式相同,使用 a 到 z 的两个单词仅由一个连字符分隔。

如果您无权访问主服务器配置,那么我建议 运行 一个脚本来重命名您的文件,至少让名称全部小写。没有 RewriteMap 是不可能的,它必须进入主配置。

参考:

我认为为更新后的问题添加另一个答案最有意义,因为我的原始答案可能对某些人有用,并且是最初提出问题的有效方法。

mod_rewrite,据我所知,循环直到 URL 没有被改变,所以我们应该能够使用它来循环直到每个单词都被改变。这是代码。

这部分需要在您的主服务器配置中,在根级别或 <VirtualHost>:

RewriteEngine on
RewriteMap uc int:toupper

那么你的 .htaccess:

RewriteEngine on
RewriteRule (.*)(?:^|-|(/))([a-z])([a-z]*)(?![a-z])(.*?)(?:\.php)?$ ${uc:}.php

应该可以了。请尝试一下,让我知道结果。

正如在评论中发现的那样,默认限制为 10 次迭代,这意味着十个字的限制。如果需要匹配十个以上的单词可以适当增加LimitInternalRecursion指令。

注意:下面的许多评论主要与测试和调整有关,直到它起作用为止,它确实起作用了。尽管后来发现裸目录也需要匹配。又是一个问题,也许是另一个问题!