使用apache mod_rewrite

时间:2017-01-11 01:21:18

标签: apache .htaccess mod-rewrite url-rewriting pascalcasing

用户友好网址应该被添加,例如:

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

我继承的文件夹结构是pascal,因此重写的网址应如下所示:

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

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

我想知道如何使用Apache的 mod_rewrite 为任何类别和文件创建一般的重写条件 - 规则对。

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

2 个答案:

答案 0 :(得分: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只用一个连字符分隔。

如果您无法访问主服务器配置,那么我建议您运行一个脚本来重命名您的文件,使名称至少为小写。如果没有RewriteMap,则无法进入主配置。

价:

答案 1 :(得分: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指令。

注意:下面的许多评论主要涉及测试和调整,直到它起作用为止。虽然后来发现裸目录也需要匹配。另一天的问题,也许是另一个问题!