.htaccess文件将尾部斜杠添加到URL

42fyovps  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(120)

我有一个博客,页面应该重定向到'漂亮的网址'如下:

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变量,我似乎无法摆脱尾随斜线,这在我的任何其他网站上都没有发生?!

bwntbbo3

bwntbbo31#

.htaccess文件中没有任何东西会附加一个尾部斜杠,但是如果/blog-post-title碰巧作为一个物理目录存在于文件系统中,Apache(mod_dir)会附加一个尾部斜杠(使用301重定向)(您还声明“其他页面工作正常”)。
在这种情况下,尝试删除尾部斜杠(没有首先设置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]-连字符正则表达式字符类中的(-)是一个特殊的 meta字符,表示字符的 * 范围 *,例如a-z。要匹配文字连字符,它应该位于字符类的开头或结尾,或者进行反斜杠转义。在字符类的中间有一个未转义的连字符。在本例中,它实际上与文字连字符匹配,但是它可能是不明确的(并且你冒着无意中匹配了一个字符范围的风险)。然而,在最后一个规则中你有两个未转义的连字符(你用连字符穿插了每个字符),这让我想知道这里的真正意图是什么?再次,碰巧这两个未转义的连字符匹配了一个字面连字符(尽管我怀疑这是否是故意的)?
    1.再加上点#1,这些规则的顺序是错误的。第一个规则将匹配top-picksprivacy-policysitemap,将所有请求重写为post.php。最后一条规则(重写为link.php)将永远不会被处理,除非请求的URL包含大写字母。最后一个规则应在第一个规则之前(但第一个“通用”规则应该是最后一个)。
    1.所有重写都缺少L标志。这并不是说在这个特定的示例中会导致问题(因为重写的URL包含一个点,并且没有一个模式与点匹配),它可能会在将来导致问题,至少会导致额外的(不必要的)处理。
    您的规则应该改为如下所示:
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]

我 * 假设 * 应该传递给link.php的8字符URL * 不 * 包含连字符。
我还禁用了多视图(无论如何它可能被禁用-但要确定),因为您也在处理无扩展名的URL(例如sitemapsitemap.php)。如果启用多视图,那么这将与您的mod_rewrite规则冲突。

83qze16e

83qze16e2#

请使用您显示的示例和尝试,尝试遵循.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]

相关问题