0
# 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..

4

1 回答 1

1

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

#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]
于 2013-07-24T14:01:30.000 回答