需要帮助修改Apache RewriteRule

时间:2014-04-08 23:01:45

标签: regex apache .htaccess mod-rewrite

我聘请了某人为我的.htaccess文件写了一些RewriteRules,它可以完成几件事,包括URL中的默认大写字母小写和默认的下划线和空格到破折号。所以URL MySite / World / Isle of_Man应默认为mysite / world / isle-of-man

他们无法做到,但他们取得了部分成功。我结束修改httpd.conf文件来处理小写的东西。然后我将他们为默认下划线写的规则添加到破折号中。

所以我的RewriteRules现在看起来像这样......

RewriteRule (.*?[A-Z]+.*) /${tolower:$1} [R]
RewriteRule ^([^_]*)_([^_]*_.*) $1-$2 [N]
RewriteRule ^([^_]*)_([^_]*)$ /$1-$2 [L,R=301]

他们工作得很好。 URL MySite / World / Isle_of_Man现在默认为mysite / world / isle-of-man

但是,它不会修复带空格的网址 - 只是下划线。另外,有人告诉我第二行和/或第三行是草率的;它取代了两个下划线而不是一个。我不确定那意味着什么。如果URL有多个下划线或空格,那么我需要用破折号替换它们。

无论如何,我想知道是否有人可以告诉我如何修改这些规则,以便用破折号替换空格。如果您看到下划线规则有任何问题,您能否告诉我如何改进它?

P.S。有些网站可以让您输入正则表达式,并查看它与各种字符串的交互方式。您是否知道测试RewriteRules的类似内容?当我正在尝试使用我的.htaccess文件时,我最终还是找到了崩溃计算机的代码。当我重新加载网页时,它会加载并加载和加载,直到我的所有软件冻结为止。

2 个答案:

答案 0 :(得分:0)

请尝试将空格和下划线更改为破折号:

RewriteRule ^(.*)(?:\ |_)(.*)$ /$1-$2 [L,E=DASH:Y]

RewriteCond %{ENV:DASH} Y
RewriteRule ^([^\ _]+)$ /$1 [L,R=301]

因此第一条规则匹配任何带空格或下划线的规则,并用破折号重写它。此外,它设置一个环境变量,让其余规则知道它重写了URL以添加破折号。第一条规则将循环,直到没有破折号为止。

如果设置了“DASH”环境变量,则仅应用第二个规则,这意味着之前有一个空格或下划线被重写。如果没有更多空格或下划线,则将浏览器重定向到新URL(将其全部替换为破折号)。

这是一种更清洁的方法。

答案 1 :(得分:0)

这很有用:

RewriteRule ^(.*?[A-Z].*) /${tolower:$1} [R]
RewriteRule ^([^_\ ]*)[_\ ](.*?[_\ ].*) $1-$2 [N]
RewriteRule ^([^_\ ]*)[_\ ]([^_\ ]*) /$1-$2 [L,R=301]
  • 在空格之前添加\使其成为RewriteRule的正则表达式的一部分。
  • 为了便于阅读,请进行一些正则表达式清理。

解释这些正则表达式:

第一个说要将任何带大写字母的路径转换为全部小写字母,然后向用户的浏览器发送重定向,告诉它使用新路径重试。

第二个说要查找至少有两个空格和/或下划线的路径并替换第一个路径,然后从头开始重新匹配(从而在每个后续下划线或空格上重新匹配,直到只剩下一个)。

最终规则与任何单个空格或下划线匹配,将其转换为破折号,并使用响应代码301“永久移动”将新的(更改的)路径发送到用户的浏览器,这有时会自动更新链接和快捷方式。

更详细:

    每行开头的
  • ^表示从每个地址的开头匹配,而不是在任何地方匹配。
  • 每对()都是按照它们出现的顺序转储到$1$2等的组。
  • 每个.*表示尽可能多地匹配任何类型的文字。
  • 每个.*?表示匹配最小的文本数量,仍可以完成整个模式。
  • [^_\ ]*匹配一系列非下划线和非空格字符。
  • [_\ ]匹配单个空格下划线。
  • [A-Z]匹配一个大写字符,足以知道该地址需要转换为小写字母。
相关问题