2

我有一种情况,我想重定向所有传入的 URL,在 URL 中使用 %20 替换为 - 对于所有出现的情况。

现在我得到这个链接 -

301重定向以将所有空格替换为连字符

这给出了这个解决方案

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]

效果很好,但是这个解决方案有一个小问题。这也会重定向对 images/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

并保持所有其他请求不变?

4

2 回答 2

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]
于 2013-07-11T10:12:46.027 回答
0

对于您想要做的事情来说,这一切似乎都非常复杂。理论上 (!!) apache 应该取消转义%20字符并将它们替换为您尝试匹配的字符串中的空格,因此以下内容应该有效:

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

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

如果问题是有时您有一个包含空格的实际文件,并且您想访问它,只需加上一个条件前缀,说明它只会在您不访问实际文件时进行重定向:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\ ]+)\ (.*)$ $1-$2 [N]
于 2013-07-11T10:17:14.367 回答