2

こんにちは 私のプロジェクトでは、次の htaccess があります。たとえば、次の URL を入力します。domain.com/ test some test / test /

domain.com/test+some+test/test 期待通りになる

少なくとも私にとって奇妙なことは、編集domain.com/test+some+test/testするときです

domain.com/test+some+test         /test

もう一度Enterキーを押すと、次のようになります。

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>

アップデート

さらに調査し、最初の 2 つの rewriterules に R スイッチを適用した後、Anubhava が示唆したように 1 つの問題のみが残っています。

入れたら こう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

4

2 に答える 2

1

書き換えルールが適用される前にエンコード+またはデコードされるスペース。つまり、この正規表現パターン:スペース、パーセント記号、2 および 0 に一致します。%20[\s%20]

その正規表現は次のようにする必要があります。

    # 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/、これは関係なく (スペース) に変換されることです。したがって、代わりに実際のリクエストと照合する必要があります。

# replace spaces by + in between
RewriteCond %{THE_REQUEST} \ /(.*?)(%20)+([^\?\ ]*)
RewriteRule ^ /%1+%3 [L,R=301,NE]
于 2013-09-27T19:27:50.087 に答える
0

最初の 2 つのルールにもフラグを追加Rします。

# 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]
于 2013-09-27T19:30:37.843 に答える