需要将%20转换为 - 使用.htaccess

时间:2013-07-24 13:50:47

标签: .htaccess

# ENABLE REWRITE ENGINE
RewriteEngine On

# CONVERT \s and %20 to MINUS SIGN
RewriteCond %{THE_REQUEST} (\s|%20)
RewriteRule ^([^\s%20]+)(?:\s|%20)+([^\s%20]+)((?:\s|%20)+.*)$ $1-$2$3 [N,DPI]
RewriteRule ^([^\s%20]+)(?:\s|%20)+(.*)$ /$1-$2 [L,R=301,DPI]

我在htaccess文件的顶部使用了以下代码片段,但它不起作用。我也尝试过stackoverflow的其他代码片段,但它们也没有用。我哪里错了?似乎为其他人而不是我工作:)。

我需要这个的原因是因为我提交给GET的表单总是将空格转换为%20 ..

1 个答案:

答案 0 :(得分:1)

首先:%{THE_REQUEST}总是包含空格。它的形式为GET /index.html HTTP/1.1。 url本身永远不会包含实际空格,因为它是url中的无效字符。它始终采用%20的形式。我在this question中的建议是这样的:

#This will rewrite every single space in the url to a dash
RewriteCond %{ENV:stripspaces} 1
RewriteRule ^(.*)%20(.*)$ $1-$2 [N]

#This will tell that when the requirements for this rule are met,
#spaces should be rewritten.
#You probably don't want that top happen for each url
RewriteCond %{REQUEST_URI} %20
RewriteRule ^(.*)$ $1 [E=stripspaces:1,E=redirect:1,N]

RewriteCond %{ENV:redirect} 1
RewriteRule ^(.*)$ $1 [R,E=!stripspaces,E=!redirect,QSA]

我认为这对你也有用。如果你真的想要在任何地方重写每个空格,你可以使用更简单的结构:

RewriteRule ^(.*)%20(.*)$ $1-$2 [N,E=redirect:1]

RewriteCond %{ENV:redirect} 1
RewriteRule ^(.*)$ $1 [R,E=!redirect,QSA]