代码之家  ›  专栏  ›  技术社区  ›  mySun

在我的项目中重定向后删除斜杠

  •  0
  • mySun  · 技术社区  · 5 年前

    我的网站运行一个名为->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 ##
    
    0 回复  |  直到 7 年前
        1
  •  210
  •   Andrea Ligios    7 年前

    正下方 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 ! 在那里 使许多浏览器缓存数据。无限期访问文件 :如果无法清除所有打开浏览器缓存的计算机上的浏览器缓存,它会以某种方式变得不可逆转。测试时,最好使用简单的 R R=302

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

        2
  •  94
  •   Gras Double    7 年前

    为了补充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} (.*)/$ .因为在根目录中 请求_URI 等于 / ,前斜杠,它会被误解为后斜杠。


    如果你对更多阅读感兴趣:

    (更新:这项技术现在正在使用。) implemented 在拉维尔5.5)

        3
  •  4
  •   Daniel Dewhurst    7 年前

    这是我在最新应用中使用的。

    # redirect the main page to landing
    ##RedirectMatch 302 ^/$ /landing
    
    # remove php ext from url
    # https://stackoverflow.com/questions/4026021/remove-php-extension-with-htaccess
    RewriteEngine on 
    
    # File exists but has a trailing slash
    # https://stackoverflow.com/questions/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
    
        4
  •  1
  •   Scout Hynson    8 年前
    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代码。再加上一点额外的安全性。