【问题标题】:URL Rewrite only main request and ignore subfoldersURL 仅重写主请求并忽略子文件夹
【发布时间】:2021-10-20 08:04:34
【问题描述】:

我已将我的论坛从 vb4(使用 vbseo)移至 vb5...

我的旧 vb4 网址是:

example.com/123-threadtitle

新的 vb5 是:

example.com/category/subcategory/123-threadtitle 

123是线程的id。

我的尝试:

RewriteRule ([0-9]+)+-[^*]+ hxxps://www.example.com/showthread.php?t=$1 [L,R=301]

它可以工作,但他再次重写了 vb5 请求,我们遇到了问题。

如何设置它以忽略文件夹请求?

RewriteCond %{REQUEST_FILENAME} !-d

不工作:-(

【问题讨论】:

  • 我认为hxxps 在您的问题中是一个奇怪的错字,而不是在您的实际代码中?我假设/showthread.php?t=123 是预期的目标 - 只是这与问题中描述的新 URL 格式完全不同。 (?)
  • 我输入了 xx,因为 stackoverflow 拒绝了域发布。

标签: regex apache .htaccess mod-rewrite


【解决方案1】:
RewriteRule ([0-9]+)+-[^*]+ hxxps://www.example.com/showthread.php?t=$1 [L,R=301]

正则表达式 (RewriteRule pattern) 未锚定,因此匹配请求的 URL 路径中的任何位置。正则表达式不排除斜杠(即路径段分隔符),因此会消耗整个 URL 路径。

如果您的旧 URL 的格式为 /123-threadtitle,那么您似乎只需要匹配第一个路径段,它自然应该排除“子文件夹”(我认为您指的是附加的 路径-segments 采用新的 URL 格式,而不是物理目录,这是您发布的 条件 检查的内容)。

请尝试以下方法:

# Redirect old URLs to "/showthread.php?t=NNNN"
RewriteRule ^(\d+)-[^/]+$ https://www.example.com/showthread.php?t=$1 [L,R=301]

这匹配/123-threadtitle,但不匹配/category/subcategory/123-threadtitle,并且外部重定向请求到/showthread.php?t=123。

在任何现有的重写之前,这需要靠近.htaccess 文件的顶部。首先使用 302(临时)重定向进行测试以避免潜在的缓存问题。


但是,出于 SEO 的目的,最好在内部将请求重写为 /showthread.php?t=123,然后在您的 PHP 代码中触发外部重定向到新 URL(即/category/subcategory/123-threadtitle)。

# Internally rewrite old URLs to "/showthread.php?t=NNNN"
RewriteRule ^(\d+)-[^/]+$ showthread.php?t=$1 [L]

【讨论】:

  • 非常感谢。
猜你喜欢
  • 2013-07-08
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2017-12-24
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多