Htaccess:URLから末尾のスラッシュを追加/削除します


81

私のウェブサイトは-> WSS壁紙スクリプトと呼ばれるスクリプトを実行します

私の問題->コンテンツの重複を防ぎ、URLをクリーンアップするために、URLの末尾にスラッシュを強制的に削除または追加しようとしています。

私はあらゆる種類を試し、考えられるすべてのことを試し、インターウェブからロードしましたが、まだそのような運はありません!それは簡単な修正かもしれませんが、私はそれをたくさん見てきましたが、おそらく死んだ明らかな何かを知らないでしょう。

だから私はあなたに私のすべての.htaccessコードを提示します:

DirectoryIndex index.php

RewriteEngine on
RewriteRule ^download/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4&download=1 [L]
RewriteRule ^file/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) image.php?id=$1&width=$2&height=$3&cropratio=$4 [L]
RewriteRule ^preview/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+) wallpaper_preview.php?id=$1&width=$2&height=$3&name=$4 [L]
RewriteRule ^thumbnail/([0-9]+)?/([0-9]+)x([0-9]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/]+) image.php?wallpaper_id=$1&width=$2&height=$3&cropratio=$4&align=$5&valign=$6&file=$7 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&page=$3 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)/p([0-9]+) index.php?task=category&id=$1&name=$2&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+)/([0-9a-zA-Z?-]+)-([0-9]+) index.php?task=category&id=$1&sortby=$3&page=$4 [L]
RewriteRule ^cat/([0-9]+)?/([^/\.]+) index.php?task=category&id=$1&name=$2 [L]
RewriteRule ^tag/([^/\.]+)/([0-9a-zA-Z?-]+)/([0-9]+) index.php?task=tag&t=$1&sortby=$2&page=$3 [L]
RewriteRule ^tag/([^/\.]+) index.php?task=tag&t=$1 [L]
RewriteRule ^profile/([0-9]+)?/([^/\.]+) index.php?task=profile&id=$1&name=$2 [L]
RewriteRule ^profile/comments/([0-9]+)?/([^/\.]+) index.php?task=users_comments&id=$1&name=$2 [L]
RewriteRule ^page/([0-9]+) index.php?task=view_page&id=$1 [L]  
RewriteRule ^register index.php?task=register [L] 
RewriteRule ^lost-password index.php?task=lost_pass [L] 
RewriteRule ^links index.php?task=links [L]
RewriteRule ^news/item/([0-9]+)/([^/\.]+) index.php?task=news&id=$1 [L]
RewriteRule ^news/page([0-9]+) index.php?task=news&page=$1 [L]
RewriteRule ^members/([^/\.]+)-([^/\.]+)/page([0-9]+)? index.php?task=member_list&sort=$1&order=$2&page=$3 [L]
RewriteRule ^members index.php?task=member_list [L]
RewriteRule ^messages index.php?task=messages [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^search/([^/\.]+) index.php?task=search&q=$1 [L]
RewriteRule ^search index.php?task=search [L]
RewriteRule ^submit index.php?task=submit [L]
RewriteRule ^r-([0-9]+)?-([0-9]+)? go.php?id=$1&ref=$2 [L]
RewriteRule ^r-([0-9]+)? go.php?id=$1 [L]
RewriteRule ^([^/\.]+)/([0-9]+)/([^/\.]+) index.php?task=view&id=$2&name=$3 [L]
RewriteRule ^news/([^/\.]+) index.php?task=news&name=$1 [L]
RewriteRule ^profile/([^/\.]+) index.php?task=profile&name=$1 [L]
RewriteRule ^news index.php?task=news [L]
RewriteRule ^page/([^/\.]+) index.php?task=view_page&name=$1 [L]  
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([0-9a-zA-Z'?-]+)/([0-9]+) index.php?task=category&name=$1&sortby=$2&page=$3 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+)/([^/\.]+) index.php?task=view&name=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+) index.php?task=category&name=$1 [L]


## www reslove ##
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
## www reslove ##

## index reslove ##
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} ^.*/index\.php
RewriteRule ^(.*)index.php$ http://www.epicwallpaper.net/$1 [R=301,L]
## index reslove ##

1
また、誰かが悪い男の子を直すことができるならば、あなたはここに返事を投稿することができますありがとう
ルーク

ここにコードを投稿してください。
シュールな夢

1
投稿を編集し、コードを投稿に貼り付けて強調表示し、「CTRL + K」を押してコードとしてフォーマットします
Jon Lin

あなたは本当に'またはURIで許可されていますか?RewriteRulesの1つ(下部近く)はそう示唆しています。.htaccessが処理する前でも、サーバーを混乱させる可能性があるのではないかと心配しています。
フィルペリー

回答:


199

RewriteEngine On線のすぐ下に、次を追加します。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R] # <- for test, for prod use [L,R=301]

トレーリングスラッシュなしのポリシーを適用します。

末尾のスラッシュポリシーを適用するには:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ /$1/ [L,R] # <- for test, for prod use [L,R=301]

編集:コメントでR=301説明されているように、パーツにコメントしました:

気をつけてR=301!そこにあると、多くのブラウザが.htaccessファイルを無期限にキャッシュします。それを開いたすべてのマシンでブラウザキャッシュをクリアできないと、どういうわけか元に戻せなくなります。テストするときは、シンプルRまたはR=302

テストが完了したら、を使用できますR=301


4
神様、私はあなたにキスすることができました!トレーリングなしのスラッシュを適用して作業したところ、もう1つは500サーバーエラーを発生させました。ありがとうJon Lin!
ルーク

22
ウェブサイトがディレクトリ(example.org/blog/など)にある場合、ノートレーリングスラッシュルールは機能しません
Gras Double

8
気をつけてR=301!そこにあると、多くのブラウザが.htaccessファイルを無期限にキャッシュします。それを開いたすべてのマシンでブラウザキャッシュをクリアできないと、どういうわけか元に戻せなくなります。テストするときは、単純な「R」または「R = 302」を使用することをお勧めします
Jonathan Weber

VirtualDocumentRootがオフの場合、最初のスラッシュを削除します。つまり$1/$1And、@ JonathanWeberの代わりに、.htaccessファイルは提供されませんが、expiresヘッダーはブラウザにリソースをキャッシュする時間を指示します。
twosjr 2017

1
@Nrcは、ファイルとディレクトリ以外にも他のタイプのマッピングがあり、リクエストがファイルにもディレクトリにもマップされないが、書き換える必要がある可能性があるためです。ネガティブは、書き直されたもの、またはファイルシステム内の何かにすでにマップされているものがスキップされることを保証します。
Jon Lin

84

Jon Linの答えを補足するために、Webサイトがディレクトリ(example.org/blog/など)にある場合にも機能するスラッシュなしの手法を次に示します。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]


完全を期すためにREQUEST_URI、スラッシュで始まる(少なくとも.htaccessファイル内で)強調する代替方法を次に示します。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L] <-- added slash here too, don't forget it

ただ、使用しないでください %{REQUEST_URI} (.*)/$。ルートディレクトリでREQUEST_URI/、先頭のスラッシュがに等しいため、末尾のスラッシュとして誤って解釈されます。


あなたがより多くの読書に興味があるなら:

(更新:この手法はLaravel 5.5に実装されました)


1
この特定のバリアントは、特に最新のURL規則を使用する場合に非常に役立ちます。よろしくお願いします。htaccessスニペットリポジトリに送信します
alexw 2015年

1
これにより、REQUEST_URI(ルート)が末尾のスラッシュとして解釈され、無限ループが発生する場合の問題が解消されます。ありがとう
Ruslan Abuzant 2016

はい、ウェブサイトがディレクトリにある場合、受け入れられた回答は渡されませんが、この回答でRewriteCond %{REQUEST_URI} (.+)/$は最後のスラッシュが1つだけ削除されます(たとえば、sth ///からsth //、sth /、sthへのリダイレクトがいくつか必要です)。1つのリダイレクトですべての末尾のスラッシュを削除するには、より適切なソリューションを使用しますRewriteCond %{REQUEST_URI} (.+?)/+$
mikep 2017年

1
私もこれについて考えていました。結果は正しいですが、それがエッジケースであることを考えると、私はコードの単純さを好みました。
グラスダブル

@GrasDouble、長い間このソリューションを探してくれてありがとう。数え切れないほどの方法を試しましたが、うまくいきました!どうもありがとうございました。

3

これは私が最新のアプリに使用したものです。

# redirect the main page to landing
##RedirectMatch 302 ^/$ /landing

# remove php ext from url
# /programming/4026021/remove-php-extension-with-htaccess
RewriteEngine on 

# File exists but has a trailing slash
# /programming/21417263/htaccess-add-remove-trailing-slash-from-url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)/+$ /$1 [R=302,L,QSA]

# ok. It will still find the file but relative assets won't load
# e.g. page: /landing/  -> assets/js/main.js/main
# that's we have the rules above.
RewriteCond %{REQUEST_FILENAME} !\.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^/?(.*?)/?$ $1.php

1
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
## hide .html extension
# To externally redirect /dir/foo.html to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+).html
RewriteRule ^ %1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.html
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]


<Files ~"^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>

これにより、補足するとhtmlコードまたはphpが削除されます。末尾のスラッシュを追加すると、末尾のスラッシュがすべて404コードをバイパスすることなく、URLと同様に表示されます。さらに、セキュリティが少し追加されました。


こんにちは、nginx用にこれをどのように記述しますか?ここでコンバーターで実行しようとしました:winginx.com/en/htaccessしかし、この結果は無限ループになります:# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }
Asle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.