Htaccess : URL에서 후행 슬래시 추가 / 제거


81

내 웹 사이트는-> WSS 벽지 스크립트라는 스크립트를 실행합니다.

내 문제 -> 중복 된 콘텐츠를 방지하고 내 URL을 정리하기 위해 내 URL 끝에 슬래시를 강제로 제거하거나 추가하려고했습니다.

나는 모든 종류를 시도했고 내가 생각할 수있는 모든 것을 시도했고 interwebs에서로드했지만 아직 그런 행운은 없었습니다! 빠른 수정일 수도 있지만 너무 많이 봤기 때문에 분명히 죽은 것에는 눈이 멀었습니다.

그래서 내 모든 .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
또한 누군가가 나쁜 소년을 고칠 수 있다면 여기에 답장을 게시 할 수 있습니까 감사합니다
Luke

여기에 코드를 게시하십시오.
Surreal Dreams

1
편집 귀하의 게시물이 게시물에 코드를 붙여 강조 표시를 눌러 "CTRL + K는"코드로 포맷합니다
존 린

당신은 정말 ' 또는 ? URI에서 허용됩니까? RewriteRules 중 하나 (하단 근처)는 그렇게 제안합니다. .htaccess가 처리하기 전에도 서버를 혼동 할 수 있다는 우려가 있습니다.
Phil Perry

답변:


194

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
키스 할 수있어! 다른 하나는 나에게 500 서버 오류를 주었다. Jon Lin에게 감사드립니다!
Luke

21
웹 사이트가 디렉토리 (예 : example.org/blog/)에있는 경우 뒤 따르지 않는 슬래시 규칙이 작동하지 않습니다
Gras Double

7
조심하세요 R=301! 거기에 있으면 많은 브라우저가 .htaccess 파일을 무기한으로 캐시합니다. 브라우저 캐시를 연 모든 컴퓨터에서 브라우저 캐시를 지울 수 없으면 어떻게 든 되돌릴 수 없게됩니다. 테스트 할 때, 더 간단한 "R"또는 "R = 302"로 이동
조나단 웨버에게

VirtualDocumentRoot가 꺼져 있으면 시작 부분의 슬래시를 제거합니다. 즉, And $1대신 /$1@JonathanWeber .htaccess 파일이 제공되지 않지만 만료 헤더는 브라우저에 리소스를 캐시 할 시간을 알려줍니다.
twicejr

1
@Nrc는 파일과 디렉터리 외에 다른 유형의 매핑이 있기 때문이며 요청이 파일이나 디렉터리에 매핑되지 않지만 다시 작성해야 할 가능성도 있습니다. 네거티브는 재 작성되었거나 이미 파일 시스템에 매핑 된 항목을 건너 뛰도록합니다.
Jon Lin

84

Jon Lin의 답변을 보완하기 위해 다음은 웹 사이트가 디렉토리 (예 : 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 snippets repository에 제출하겠습니다 .
alexw 2015 년

1
이렇게하면 REQUEST_URI (루트)가 후행 슬래시로 해석되어 무한 루프가 발생할 때 문제가 해결됩니다. 감사합니다
Ruslan Abuzant

예, 수락 된 답변은 웹 사이트가 디렉토리에있는 경우 처리하지 않지만이 답변은 RewriteCond %{REQUEST_URI} (.+)/$마지막 후행 슬래시 하나만 제거합니다 (예 : sth ///에서 sth //에서 sth /에서 sth 로의 여러 리디렉션이 필요함). 한 번의 리디렉션에서 모든 후행 슬래시를 제거하려면 더 나은 솔루션을 사용하십시오RewriteCond %{REQUEST_URI} (.+?)/+$
mikep

1
나도 이것에 대해 생각했다. 하지만 결과는 정확하고 엣지 케이스라는 점을 고려할 때 코드 단순성을 선호했습니다.
Gras Double

@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가 제거됩니다. 후행 슬래시를 추가 할 수 있으며 후행 슬래시가없는 URL뿐만 아니라 404 코드를 모두 우회합니다. 또한 약간의 보안이 추가되었습니다.


안녕하세요, 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.