htaccess:从URL添加/删除尾部斜杠


81

我的网站运行的脚本名为-> WSS壁纸脚本

我的问题->我一直在尝试强制删除或在URL的末尾添加斜杠,以防止重复的内容并清理URL。

我尝试了各种尝试,尝试了所有可以想到的东西,并尝试从Interweb进行加载,但是还没有运气!这可能是一个快速修复,但是我已经看了太多了,以至于我可能看不到某些显而易见的东西。

因此,我向您提供所有.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

请在此处发布代码。
超现实主义之梦2014年

1
编辑您的帖子,将您的代码粘贴到您的帖子中,突出显示它,然后按“ CTRL + K”将其设置为代码格式
Jon Lin

你真的有 '在您的URI中允许?RewriteRules之一(在底部附近)建议如此。我担心它们甚至在.htaccess可以处理它们之前就可能使服务器感到困惑。
Phil Perry

Answers:


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文件:如果您不能在所有打开它的机器上清除浏览器缓存,它就会以某种方式不可逆转。测试时,最好选择简单RR=302

完成测试后,您可以使用R=301


4
上帝,我可以吻你!与强制执行不拖尾斜线一起工作,另一个给了我500服务器错误,谢谢乔恩·林!
路加福音

21
如果网站位于目录中(例如example.org/blog/),则no-trailing-slash规则不起作用
Gras Double

7
注意这一点R=301!将其放置在其中会使许多浏览器无限期地缓存.htaccess文件:如果您不能在所有打开它的机器上清除浏览器缓存,它就会以某种方式不可逆转。测试时,最好使用简单的“ R”或“ R = 302”
Jonathan Weber

禁用VirtualDocumentRoot时,请在开头删除斜杠,即::$1而不是/$1And,@JonathanWeber,不提供.htaccess文件,但是expires标头告诉浏览器将资源缓存多长时间。
twojr

1
@Nrc,因为除了文件和目录以外还有其他类型的映射,并且请求也有可能既不映射到文件也不映射到目录,而是需要重写。否定项确保跳过已重写或已映射到文件系统中某些内容的内容。
乔恩·林

84

为了补充乔恩·林的答案,以下是一种无痕斜杠技术,如果网站位于目录中(例如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代码段存储库
亚历克斯2015年

1
这消除了当REQUEST_URI(根)解释为尾部斜线也会引起无限循环时的问题。谢谢
Ruslan Abuzant '16

是的,如果网站位于目录中,则可接受的答案不会派上用场,但是此答案RewriteCond %{REQUEST_URI} (.+)/$仅带有最后一个斜杠(例如,从sth ///到sth //到sth /到sth的多次重定向)。要在一个重定向中删除所有结尾的斜杠,请使用更好的解决方案RewriteCond %{REQUEST_URI} (.+?)/+$
mikep '17

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.