301使用空格重定向URL

时间:2013-07-11 09:37:58

标签: .htaccess

我有一种情况,我希望将所有传入的URL重定向到URL中的%20,以替换为 - 对于所有事件。

现在我收到了这个链接 -

  

301 Redirect to replace all spaces to hyphens

给出了这个解决方案

Options +FollowSymlinks -MultiViews
RewriteEngine on

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]

这完美但这个解决方案存在一个小问题。这也会重定向image / docs / pdf或其他资源的请求,并导致404

我能否拥有仅重定向某些部分的内容,而不是所有传入的链接都会替换和重定向仅用于

www.test.com/colleges/this%20is%20my%20link/123 to
www.test.com/colleges/this-is-my-link/123
or
www.test.com/schools/this%20is%20my%20link/123 to
www.test.com/schools/this-is-my-link/123

并保留所有其他请求完整?

2 个答案:

答案 0 :(得分:1)

将您的代码更改为:

RewriteRule \.(jpe?g|png|gif|ico|bmp|pdf|docx?|txt|css|js)$ - [L,NC]

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]

答案 1 :(得分:0)

对于你想做的事情,这一切看起来都非常复杂。从理论上讲(!!)apache应该忽略%20个字符,并用你想要匹配的字符串中的空格替换它们,所以以下内容应该有效:

RewriteRule ^([^\ ]+)\ (.*)$ $1-$2 [N]

它基本上将任何请求的URI拆分为非空格字符,后跟空格,后跟任何内容,并将空格重写为-。然后重复所有重写([N]),以便它可以替换下一个空格,直到它不匹配。

如果问题是有时你有一个有空格的实际文件,而你想要访问它,只需添加一个条件前缀,如果你没有访问实际文件,它只会进行重定向:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\ ]+)\ (.*)$ $1-$2 [N]