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

Luk*_*uke 75 php apache .htaccess mod-rewrite

我的网站运行一个名为 - > 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 ##
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 173

在该RewriteEngine On行下方,添加:

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

实施无拖尾斜线政策.

要强制执行斜杠策略:

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

编辑:评论R=301部分,因为,如评论中所述:

小心一点R=301!拥有它使许多浏览器无限期地缓存.htaccess文件:如果你无法在打开它的所有机器上清除浏览器缓存,它就会变得不可逆转.测试时,最好选择简单R或者R=302

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

  • 如果网站位于目录中(如example.org/blog/),则无尾随斜杠规则不起作用 (19认同)
  • 小心那个'R = 301`!拥有它使许多浏览器无限期地缓存.htaccess文件:如果你无法在打开它的所有机器上清除浏览器缓存,它就会变得不可逆转.测试时,最好选择简单的"R"或"R = 302" (5认同)
  • 上帝,我可以吻你!工作强制执行无尾随斜线另一个给了我500服务器错误谢谢Jon Lin! (3认同)

Gra*_*ble 76

为了补充Jon Lin的答案,这里有一个无拖尾斜线技术,如果网站位于目录中(例如example.org/blog/),它也可以使用:

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


为了完整起见,这里有另一种强调,REQUEST_URI以斜杠开头(至少在.htaccess文件中):

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

只是不要使用 %{REQUEST_URI} (.*)/$.因为在根目录中REQUEST_URI等于/,前导斜杠,它会被误解为尾部斜杠.


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

(更新:此技术现在在Laravel 5.5中实现)

  • 这个特殊的变体非常有用,尤其是在使用现代 URL 约定时。希望您不介意,我将其提交到 [htaccess 片段存储库](https://github.com/phanan/htaccess)。 (2认同)
  • 这消除了当 REQUEST_URI (root) 被解释为尾部斜杠时也会导致无限循环的问题。谢谢 (2认同)
  • 尝试过,它适用于前端,但不幸的是我遇到了另一个问题:在子文件夹中安装了多个Wordpress:`example.com/wp1``example.com/wp2`等,对于这些安装,在Wordpress中保存内容突然被破坏(POST 请求不知怎的没有正确到达)。在写这篇评论时,我发现:将 `RewriteCond %{REQUEST_METHOD} !=POST` 添加到对我有用的规则中,添加了尾部斜杠,并且 WordPress 没有被破坏。 (2认同)