提问人:Josh Magness 提问时间:3/8/2023 最后编辑:MrWhiteJosh Magness 更新时间:3/8/2023 访问量:680
.htaccess文件向URL添加尾部斜杠
.htaccess file adding trailing slash to URL
问:
我有一个博客,这些页面应该重定向到“漂亮的 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
答:
使用您显示的示例和尝试,请尝试遵循 .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]
评论
/post/
/blog-post-title
文件中没有任何内容会附加尾部斜杠。但是,如果 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
但是,您的规则中还有其他错误,这些错误会阻止它们按预期工作......
[a-z-0-9]
- 正则表达式字符类中的连字符 () 是一种特殊的元字符,表示一系列字符,例如。.若要匹配文字连字符,它应位于字符类的开头或结尾,或者反斜杠转义。字符类中间有一个未转义的连字符。碰巧的是,在这种情况下,这确实匹配了字面上的连字符,但它可以说是模棱两可的(并且您冒着无意中匹配一系列字符的风险)。然而,在最后一条规则中,你有两个未转义的连字符(你用连字符穿插了每个字符),这让我想知道这里的真正意图是什么?同样,碰巧这两个未转义的连字符与字面连字符匹配(尽管我怀疑这是否是故意的)?-
a-z
再加上第 #1 点,这些规则的顺序错误。第一条规则将匹配 ,和 ,将所有请求重写为 。因此,除非请求的 URL 包含大写字母,否则永远不会处理最后一条规则(重写为 )。最后一条规则应位于第一条规则之前(但第一条“通用”规则应位于最后)。
top-picks
privacy-policy
sitemap
post.php
link.php
您在所有重写中都缺少该标志。并不是说这应该在这个特定实例中导致问题(因为重写的 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规则冲突。sitemap
sitemap.php
评论
https://www.example.org/blog-post-title/