1

用户友好的 URL应使用连字符,例如:

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对任何类别和文件使用通用的重写条件规则对来做到这一点。

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

4

2 回答 2

1

请注意,自编写此答案以来,该问题已更新,并且最初并未说明其格式不一致-此答案涵盖单词-单词/单词-单词

这部分需要在您的主服务器配置中,在根级别或<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:$1}$2%{uc:$3}$4/%{uc:$5}$6%{uc:$7}$8.php

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

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

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

参考:

于 2017-01-11T02:49:11.000 回答
1

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

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

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

RewriteEngine on
RewriteMap uc int:toupper

然后在你的.htaccess

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

那应该这样做。请尝试一下,让我知道结果。

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

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

于 2017-01-11T04:39:46.550 回答