我有一个博客,页面应该重定向到'漂亮的网址'如下:
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
变量,我似乎无法摆脱尾随斜线,这在我的任何其他网站上都没有发生?!
2条答案
按热度按时间bwntbbo31#
在
.htaccess
文件中没有任何东西会附加一个尾部斜杠,但是如果/blog-post-title
碰巧作为一个物理目录存在于文件系统中,Apache(mod_dir)会附加一个尾部斜杠(使用301重定向)(您还声明“其他页面工作正常”)。在这种情况下,尝试删除尾部斜杠(没有首先设置
DirectorySlash Off
)将导致重定向循环。如果是这种情况,那么您需要删除/重命名物理文件系统目录。
但请注意,这个“永久”重定向将被浏览器和任何中间缓存永久缓存,因此您需要确保在解决重定向的原因后清除任何缓存。
但是,您的规则中存在其他错误,将阻止它们按预期工作...
[a-z-0-9]
-连字符正则表达式字符类中的(-
)是一个特殊的 meta字符,表示字符的 * 范围 *,例如a-z
。要匹配文字连字符,它应该位于字符类的开头或结尾,或者进行反斜杠转义。在字符类的中间有一个未转义的连字符。在本例中,它实际上与文字连字符匹配,但是它可能是不明确的(并且你冒着无意中匹配了一个字符范围的风险)。然而,在最后一个规则中你有两个未转义的连字符(你用连字符穿插了每个字符),这让我想知道这里的真正意图是什么?再次,碰巧这两个未转义的连字符匹配了一个字面连字符(尽管我怀疑这是否是故意的)?1.再加上点#1,这些规则的顺序是错误的。第一个规则将匹配
top-picks
、privacy-policy
和sitemap
,将所有请求重写为post.php
。最后一条规则(重写为link.php
)将永远不会被处理,除非请求的URL包含大写字母。最后一个规则应在第一个规则之前(但第一个“通用”规则应该是最后一个)。1.所有重写都缺少
L
标志。这并不是说在这个特定的示例中会导致问题(因为重写的URL包含一个点,并且没有一个模式与点匹配),它可能会在将来导致问题,至少会导致额外的(不必要的)处理。您的规则应该改为如下所示:
我 * 假设 * 应该传递给
link.php
的8字符URL * 不 * 包含连字符。我还禁用了多视图(无论如何它可能被禁用-但要确定),因为您也在处理无扩展名的URL(例如
sitemap
到sitemap.php
)。如果启用多视图,那么这将与您的mod_rewrite规则冲突。83qze16e2#
请使用您显示的示例和尝试,尝试遵循.htacess规则文件。请确保在测试URL之前清除浏览器缓存。