Htaccess: thêm / xóa dấu gạch chéo khỏi URL


81

Trang web của tôi chạy một tập lệnh có tên -> Tập lệnh hình nền WSS

Vấn đề của tôi -> Tôi đã cố gắng buộc xóa hoặc thêm dấu gạch chéo vào cuối URL của mình để ngăn nội dung trùng lặp và cũng để xóa các URL của tôi.

Tôi đã thử tất cả các loại và thử tất cả mọi thứ tôi có thể nghĩ ra và tải từ các interwebs nhưng vẫn chưa có may mắn như vậy! Nó có thể là một sửa chữa nhanh chóng nhưng tôi đã xem xét nó rất nhiều, tôi có thể bị mù với một cái gì đó rõ ràng chết.

Vì vậy, tôi giới thiệu cho bạn tất cả .htaccessmã của tôi :

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
Ngoài ra Nếu ai đó có thể sửa lỗi cậu bé, bạn có thể đăng trả lời ở đây Cảm ơn bạn
Luke

Vui lòng đăng mã ở đây.
Những giấc mơ siêu thực vào

1
Chỉnh sửa bài viết của bạn, dán mã của bạn vào bài viết của bạn, làm nổi bật nó, nhấn "Ctrl + K" để định dạng nó như mã
Jon Lin

Bạn thực sự có ' hoặc ? được phép trong URI của bạn? Một trong những RewriteRules (gần cuối) gợi ý như vậy. Tôi lo ngại rằng chúng có thể gây nhầm lẫn cho máy chủ ngay cả trước khi .htaccess có thể xử lý chúng.
Phil Perry

Câu trả lời:


194

Ngay bên dưới RewriteEngine Ondòng, thêm:

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

để thực thi chính sách không có dấu gạch chéo.

Để thực thi chính sách dấu gạch chéo:

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

EDIT : đã nhận xét các R=301phần bởi vì, như đã giải thích trong một nhận xét:

Hãy cẩn thận với điều đóR=301 ! Việc có nó ở đó khiến nhiều trình duyệt lưu vào bộ nhớ cache tệp .htaccess vô thời hạn : Bằng cách nào đó, nó sẽ trở nên không thể phục hồi nếu bạn không thể xóa bộ nhớ cache của trình duyệt trên tất cả các máy đã mở nó. Khi thử nghiệm, tốt hơn hãy chọn đơn giản RhoặcR=302

Sau khi hoàn thành các bài kiểm tra của mình, bạn có thể sử dụng R=301.


4
Chúa ơi, tôi có thể hôn bạn! Đã làm việc với việc thực thi một dấu gạch chéo không có dấu gạch chéo, cái còn lại đã cho tôi lỗi máy chủ 500 Cảm ơn bạn Jon Lin!
Luke

21
Quy tắc không dấu gạch chéo sẽ không hoạt động nếu trang web nằm trong một thư mục (như example.org/blog/)
Gras Double

7
Hãy cẩn thận với điều đó R=301! Việc có nó ở đó khiến nhiều trình duyệt lưu vào bộ nhớ cache tệp .htaccess vô thời hạn: Bằng cách nào đó, nó sẽ trở nên không thể phục hồi nếu bạn không thể xóa bộ nhớ cache của trình duyệt trên tất cả các máy đã mở nó. Khi kiểm tra, tốt hơn hãy chọn đơn giản "R" hoặc "R = 302"
Jonathan Weber

Khi VirtualDocumentRoot tắt, hãy xóa dấu gạch chéo ở đầu, tức là: $1thay vì /$1And, @JonathanWeber, tệp .htaccess không được cung cấp, nhưng tiêu đề hết hạn cho trình duyệt biết thời gian lưu trữ tài nguyên vào bộ nhớ cache.
twicejr

1
@Nrc vì có các loại ánh xạ khác ngoài tệp và thư mục, và cũng có khả năng là một yêu cầu ánh xạ tới tệp hoặc thư mục không phải tệp cũng như thư mục nhưng cần được viết lại. Điều phủ định đảm bảo rằng một cái gì đó đã được viết lại hoặc đã được ánh xạ đến một cái gì đó trong hệ thống tệp được bỏ qua.
Jon Lin

84

Để bổ sung cho câu trả lời của Jon Lin, đây là một kỹ thuật không có dấu gạch chéo cũng hoạt động nếu trang web được đặt trong một thư mục (như example.org/blog/):

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


Vì lợi ích của sự đầy đủ, đây là một cách thay thế nhấn mạnh REQUEST_URIbắt đầu bằng dấu gạch chéo (ít nhất là trong .htaccesscác tệp):

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

Chỉ cần không sử dụng %{REQUEST_URI} (.*)/$ . Bởi vì trong thư mục gốc REQUEST_URIbằng /, dấu gạch chéo ở đầu và nó sẽ bị hiểu sai thành dấu gạch chéo ở cuối.


Nếu bạn quan tâm đọc thêm:

(cập nhật: kỹ thuật này hiện được triển khai trong Laravel 5.5)


1
Biến thể cụ thể này thực sự hữu ích, đặc biệt khi sử dụng các quy ước URL hiện đại. Hy vọng bạn không phiền, tôi đang gửi nó đến kho lưu trữ đoạn mã htaccess .
alexw

1
Điều này giúp loại bỏ vấn đề khi REQUEST_URI (gốc) được hiểu là dấu gạch chéo cũng gây ra vòng lặp vô hạn. Cảm ơn bạn
Ruslan Abuzant

Có, câu trả lời được chấp nhận không xử lý nếu trang web nằm trong một thư mục, nhưng câu trả lời này RewriteCond %{REQUEST_URI} (.+)/$chỉ xóa một dấu gạch chéo cuối cùng (ví dụ: một số chuyển hướng bắt buộc từ sth /// sang sth // đến sth / to sth). Để loại bỏ tất cả các dấu gạch chéo trong một lần chuyển hướng, hãy sử dụng giải pháp tốt hơnRewriteCond %{REQUEST_URI} (.+?)/+$
mikep

1
Tôi cũng đã nghĩ về điều này. Mặc dù vậy, kết quả là chính xác và coi đó là một trường hợp khó hiểu, tôi thích sự đơn giản của mã hơn.
Gras Double

@GrasDouble, cảm ơn bạn đã tìm kiếm giải pháp này trong một thời gian dài. đã thử vô số phương pháp nhưng bạn vẫn hoạt động tốt! cảm ơn rất nhiều.

3

Đây là những gì tôi đã sử dụng cho ứng dụng mới nhất của mình.

# 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>

Điều này sẽ loại bỏ mã html hoặc php nếu bạn bổ sung nó. Cho phép bạn thêm dấu gạch chéo và nó xuất hiện cũng như url không có dấu gạch chéo đều bỏ qua mã 404. Thêm một chút bảo mật.


Xin chào, Bạn sẽ viết cái này như thế nào cho nginx? Tôi đã cố gắng chạy nó trong một trình chuyển đổi ở đây: winginx.com/en/htaccess nhưng kết quả này cho tôi vòng lặp vô hạn:# nginx configuration location / { rewrite ^(.*)$ /%1 redirect; rewrite ^(.*)$ /%1 redirect; rewrite ^/([^\.]+)$ /$1.html break; } location ~ ^.*\.([Hh][Tt][Aa]) { deny all; }
Asle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.