.htaccess文件向URL添加尾部斜杠

.htaccess file adding trailing slash to URL

提问人:Josh Magness 提问时间:3/8/2023 最后编辑:MrWhiteJosh Magness 更新时间:3/8/2023 访问量:680

问:

我有一个博客,这些页面应该重定向到“漂亮的 URL”,如下所示:

https://www.example.org/blog-post-title

我正在使用以下代码:

RewriteEngine On

# SSL
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# GENERAL
RewriteRule ^([a-z-0-9]+)$ post.php?blog_slug=$1
RewriteRule ^top-picks$ top.php
RewriteRule ^privacy-policy$ privacy.php
RewriteRule ^sitemap$ sitemap.php
RewriteRule ^([a-z-A-Z-0-9]{8})$ link.php?redirect=$1

我以前使用过很多次(以一种或另一种变体) - 但它添加了一个尾部斜杠,并且每次都找不到页面:

https://www.example.org/blog-post-title/

有人知道我做错了什么吗??其他页面工作正常 - 页面上的代码正确调用了变量,我似乎无法摆脱尾部斜杠,而且它没有发生在我的任何其他网站上?!post.php$_GET

.htaccess 重定向 mod-rewrite friendly-url

评论

0赞 RavinderSingh13 3/8/2023
欢迎来到 SO,感谢您添加您的努力/htacces 文件。除了显示的规则之外,此.htaccess文件中还有其他规则吗?或者您的环境中是否有任何其他 .htacces 文件?请确认一次。
1赞 Josh Magness 3/8/2023
这就是它的全部 - 没有其他 .htaccess 文件
0赞 RavinderSingh13 3/8/2023
所以你的意思是你正在点击示例 URL,而它没有删除其中的尾部斜杠?或者它甚至在没有斜杠的 URL 末尾添加斜杠?https://www.example.org/blog-post-title/
0赞 Josh Magness 3/8/2023
它正在添加它,我在链接中没有它。当我将鼠标悬停在链接上(在代码中)时,末尾没有尾部斜杠
0赞 RavinderSingh13 3/8/2023
请检查链接 stackoverflow.com/questions/71212482/... 如果这对您有帮助,请干杯。

答:

0赞 RavinderSingh13 3/8/2023 #1

使用您显示的示例和尝试,请尝试遵循 .htacess 规则文件。请确保在测试URL之前清除浏览器缓存。

RewriteEngine On

# SSL
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# GENERAL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z-0-9]+)$ post.php?blog_slug=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^top-picks$ top.php  [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^privacy-policy$ privacy.php  [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^sitemap$ sitemap.php  [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-z-A-Z-0-9]{8})$ link.php?redirect=$1  [NC,QSA,L]

评论

0赞 Josh Magness 3/8/2023
谢谢你 - 虽然它没有用。它使所有页面都链接到 post.php 页面,并且实际的帖子在末尾仍然有一个尾部斜杠。
0赞 Josh Magness 3/8/2023
奇怪的是,如果我在重写开始时用假文件夹添加一个斜杠,它就可以正常工作。
0赞 Josh Magness 3/8/2023
重写规则 ^/post/([a-z-0-9]+)$ post.php?blog_slug=$1
0赞 CBroe 3/8/2023
@JoshMagness以它开头时,它不再与您的开始匹配,而且在 .htaccess 中配置时,RewriteRule 检查的路径永远不会以尾部斜杠开头。因此,这条规则根本就不做任何事情了,您还不如评论它或删除它。/post//blog-post-title
0赞 MrWhite 3/8/2023 #2

文件中没有任何内容会附加尾部斜杠。但是,如果 Apache (mod_dir) 恰好作为文件系统上的物理目录存在,则会附加尾部斜杠(带有 301 重定向)。(您还声明“其他页面工作正常”。.htaccess/blog-post-title

在这种情况下,尝试删除尾部斜杠(不首先设置 )将导致重定向循环。DirectorySlash Off

如果是这种情况,则需要删除/重命名物理文件系统目录。

但请注意,此“永久”重定向将被浏览器和任何中间缓存永久缓存,因此您需要确保在解决重定向原因后清除所有缓存。

RewriteRule ^([a-z-0-9]+)$ post.php?blog_slug=$1
RewriteRule ^top-picks$ top.php
RewriteRule ^privacy-policy$ privacy.php
RewriteRule ^sitemap$ sitemap.php
RewriteRule ^([a-z-A-Z-0-9]{8})$ link.php?redirect=$1

但是,您的规则中还有其他错误,这些错误会阻止它们按预期工作......

  1. [a-z-0-9]- 正则表达式字符类中的连字符 () 是一种特殊的元字符,表示一系列字符,例如。.若要匹配文字连字符,它应位于字符类的开头或结尾,或者反斜杠转义。字符类中间有一个未转义的连字符。碰巧的是,在这种情况下,这确实匹配了字面上的连字符,但它可以说是模棱两可的(并且您冒着无意中匹配一系列字符的风险)。然而,在最后一条规则中,你有两个未转义的连字符(你用连字符穿插了每个字符),这让我想知道这里的真正意图是什么?同样,碰巧这两个未转义的连字符与字面连字符匹配(尽管我怀疑这是否是故意的)?-a-z

  2. 再加上第 #1 点,这些规则的顺序错误。第一条规则将匹配 ,和 ,将所有请求重写为 。因此,除非请求的 URL 包含大写字母,否则永远不会处理最后一条规则(重写为 )。最后一条规则应位于第一条规则之前(但第一条“通用”规则应位于最后)。top-picksprivacy-policysitemappost.phplink.php

  3. 您在所有重写中都缺少该标志。并不是说这应该在这个特定实例中导致问题(因为重写的 URL 包含一个点,并且没有一个模式与点匹配),它可能会在将来引起问题,并且至少会导致额外的(不必要的)处理。L

你的规则应该像这样重写:

Options -MultiViews

RewriteEngine On

# SSL
RewriteCond %{HTTPS} off 
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# GENERAL
RewriteRule ^top-picks$ top.php [L]
RewriteRule ^privacy-policy$ privacy.php [L]
RewriteRule ^sitemap$ sitemap.php [L]
RewriteRule ^([a-zA-Z0-9]{8})$ link.php?redirect=$1 [L]
RewriteRule ^([a-z0-9-]+)$ post.php?blog_slug=$1 [L]

假设应该传递的 8 个字符的 URL 包含连字符。link.php

我还禁用了 MultiView(无论如何它都可能被禁用 - 但可以肯定的是),因为您还在处理无扩展名的 URL(例如。 更改为 )。如果启用了 MultiView,则这将与您的mod_rewrite规则冲突。sitemapsitemap.php

评论

1赞 Josh Magness 3/9/2023
这只是一张票!谢谢!效果很好!!