2013-09-27 4 views
2

Привет В моем проекте у меня есть следующий htaccess. Все работает нормально, например, я введите следующий адрес domain.com/ test some test / test /htaccess странное поведение при удалении пробела

, который становится domain.com/test+some+test/test как ожидается

Странная вещь для меня, по крайней мере, когда я редактирую domain.com/test+some+test/test к

domain.com/test+some+test   /test 

и нажмите ввод затем он приводит к следующим результатам:

domain.com/test+some+test%20%20%20%20%20/test 

Не должно ли это снова исчезнуть? Если мне что-то не хватает, пожалуйста, укажите это.

Options All -Indexes +FollowSymLinks -MultiViews 

    <IfModule mod_rewrite.c> 

     # Turn mod_rewrite on 
     RewriteEngine On 
     RewriteBase/

     # remove spaces from start or after/
     RewriteRule ^(.*/|)[\s%20]+(.+)$ $1$2 [L] 
     # remove spaces from end or before/
     RewriteRule ^(.+?)[\s%20]+(/.*|)$ $1$2 [L] 


     # replace spaces by + in between 
     RewriteRule ^([^\s%20]*)(?:\s|%20)+(.*)$ $1+$2 [L,R=301] 


     # Remove trailing slash 
     RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [L,R=301] 

     # Add trailing slash 
     #RewriteCond %{REQUEST_URI} !(/$|\.) 
     #RewriteRule (.*) %{REQUEST_URI}/ [L,R=301] 

     # Remove multiple slashes 
     RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC] 
     RewriteRule ^(.*) $1 [R=301,L] 

     # Clean url rewrite 
     RewriteCond %{REQUEST_FILENAME} !-d 
     RewriteCond %{REQUEST_FILENAME} !-f 
     RewriteCond %{REQUEST_URI} !^.*\.(png|jpg|jpeg|bmp|gif|css|js|json)$ [NC] 
     RewriteRule ^(.*)$ /index.php?req=$1 [L,QSA] 

    </IfModule> 

UPDATE

После дальнейшего изучения и применения R переключатель на первых 2 RewriteRules как предложено анубхава только один вопрос остается

вхожу http://tms.localhost/test+some+test /test становится http://tms.localhost/test+some+test%20%20%20/test, но если я введу его как это http://tms.localhost/test some test /test становится таким, как ожидается http://tms.localhost/test+some+test/test

ответ

0

Добавить R флаг в ваших первых 2 правил также:

# remove spaces from start or after/
RewriteRule ^(.*/|)[\s%20]+(.+)$ $1$2 [L,R,NE] 
# remove spaces from end or before/
RewriteRule ^(.+?)[\s%20]+(/.*|)$ $1$2 [L,R,NE] 
+0

Ом снова: P это не удается Anubhava domain.com/ привет + есть + мальчик% 20% 20% 20/тест. Тест: domain.com/hello+there+boy/test (3spaces, как вы видите) – Syd

+0

В вашем браузере вы входите в 'http://domain.com/test+some+test/test' правильно? – anubhava

+0

Да с 3 пробелами перед/тестом – Syd

1

Пробелы, которые кодируются как + или %20 получите , декодированный, прежде чем будут применены правила перезаписи. Это означает, что это регулярное выражение: [\s%20] соответствует пробелам, знакам процента, 2 и 0.

Это регулярное выражение должно быть просто:

# remove spaces from start or after/
    RewriteRule ^(.*/|)[\s]+(.+)$ $1$2 [L] 
    # remove spaces from end or before/
    RewriteRule ^(.+?)[\s]+(/.*|)$ $1$2 [L] 

Проблема заключается в том, если браузер запрашивает: /test+test%20test/ или /test%20test+test/, это собирается получить trasnlated в (космос) независимо. Поэтому вы должны совпадать с фактической просьбой вместо:

# replace spaces by + in between 
RewriteCond %{THE_REQUEST} \ /(.*?)(%20)+([^\?\ ]*) 
RewriteRule^/%1+%3 [L,R=301,NE] 
+0

Не работает и замена пространство в середине либо – Syd

+0

@PanagiotisGeorgeRaditsas он только заменяет '% 20' с' + ', который казался мне тем, что вы хотели. –

+0

@PanagiotisGeorgeRaditsas Я отредактировал регулярное выражение для обработки нескольких '% 20''s –

Смежные вопросы