我有一种情况,我希望将所有传入的URL重定向到URL中的%20,以替换为 - 对于所有事件。
现在我收到了这个链接 -
给出了这个解决方案
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
并保留所有其他请求完整?
答案 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]