我聘请了某人为我的.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文件时,我最终还是找到了崩溃计算机的代码。当我重新加载网页时,它会加载并加载和加载,直到我的所有软件冻结为止。
答案 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]
匹配一个大写字符,足以知道该地址需要转换为小写字母。