【问题标题】:How to redirect static to dynamic URL's using .htaccess (on Wordpress site)如何使用 .htaccess 将静态重定向到动态 URL(在 Wordpress 网站上)
【发布时间】:2015-07-10 08:21:17
【问题描述】:

我接管了以前的站点/域,并使用 Wordpress 建立了一个新站点。 WP 安装会将 URL 重写为静态 URL,正如您所期望的那样。

同时我想保留以前的页面,因为它们有传入的链接。我对 301 将它们添加到“新”页面不感兴趣。

旧的 URL 结构是 /index.php?id=123,我怀疑这会导致 WP .htaccess 文件出现问题。作为参考,它是这样的:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

我尝试添加以下内容:

RewriteRule ^([0-9]+).html index.php?id=$1 [R,L]

不起作用。只需重定向到site.com/?id=123 并显示首页。

我应该补充一点,我计划将这些新页面添加为 123.html、321.html 等格式的常规静态 HTML 文件。

如何使用 .htaccess 使其与 WP 安装以及 WP 放入 .htaccess 文件的内容一起工作?

澄清一下:

我想让我的 123.html 静态 HTML 页面为 index.php?id=123。当您访问index.php?id=123 时,它应该会显示123.html,但会在地址栏中显示index.php?id=123。如果你访问123.html,它应该是301到index.php?id=123

【问题讨论】:

  • 如果您要添加实际的静态 HTML 页面,它们应该可以正常工作,不是吗?规则基本上说明 如果是 index.php,则将其传递给未修改的,然后 如果它既不是文件也不是目录,则将其传递给 index.php ...没有任何影响一个名为 123.html 的实际文件
  • 谢谢,但我认为你误会了。我想保留动态 URL。我希望 123.html 文件在浏览器 URL 字段中读取 index.php?id=123。
  • 所以您想有效地将​​/index.php?id=123 指向/123.html?您可能会遇到问题 - 仅重写匹配路径,而不是查询字符串,因此您需要使用 RewriteCond,请参阅:stackoverflow.com/questions/13073253/…
  • 是的,我想让我的 123.html 静态 HTML 页面成为 index.php?id=123。当您访问index.php?id=123 时,它应该会显示123.html,但会在地址栏中显示index.php?id=123。如果您访问 123.html,它应该是 301 到 index.php?id=123。我查看了您的 URL,但我不知道如何使其适应我的情况。不介意请指教。谢谢
  • 你不想 301 重定向它......这需要一个实际的答案,所以,一分钟。

标签: php wordpress .htaccess mod-rewrite redirect


【解决方案1】:

要将带有查询字符串的 URL 映射到实际文件,您需要使用 RewriteCond 来匹配查询字符串本身(RewriteRule 不匹配):

应该这样做:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# retrieve X.html when index.php?id=X is requested
RewriteCond %{REQUEST_FILENAME} index\.php
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteCond %1.html -F
RewriteRule .* %1.html? [L]

# standard WordPress routing
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

这将首先检查您是否收到了对 index.php 的请求,其中包含类似 id=X 的查询字符串。

然后它会检查一个名为X.html的文件是否真的存在;我不是 100% 很高兴不得不使用更系统的子请求文件检查 -F 而不是标准的 -f 但我看不到解决办法在这种情况下,在 .htaccess 中。

如果 X.html 确实存在,它将获取该文件,同时将 URL 保留为 index.php?id=X

但是,如果该文件不存在,它将回退到标准 WordPress 无文件无目录路由到 index.php

我不是 WordPress 专家,但这应该可以;我猜主 WordPress 控制器使用$_SERVER['REQUEST_URI'] 来确定操作。


注意:但是,这不会阻止人们通过访问 URL www.site.com/123 直接访问 123.html。 html - 我一直陷入无限循环和 Apache 500 错误,试图阻止这种情况:|

【讨论】:

  • 感谢您的努力。代码现在是:# BEGIN WordPress &lt;IfModule mod_rewrite.c&gt; RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] RewriteCond %{QUERY_STRING} ^id=([0-9]+)$ RewriteRule (.*) $1.html [L] &lt;/IfModule&gt; # END WordPress 它重定向到 site.com/?=123 并返回 404。
  • 我明白你所说的关于不将 index.php?id=123 重定向到文件 123.html 的内容。我需要它,但这是次要的,因为没有人会知道查找 123.html,因为 index.php?id=123 是具有指向它的外部链接的原始 URL。 OT:我刚刚完整地尝试了您最新的编辑,它仍然只是重定向到/?id=123 并报告 404。我已经清除了缓存并在另一个浏览器中尝试过。
  • @TraceDeCoy - 抱歉,我不得不去超市取另一半,然后在...更新后忘记签到
  • 我很高兴你花时间帮助 CD001,真的。但是,即使使用更新的代码,它也会做同样的事情。我已将名为 123.html 的“测试”文件上传到根目录。然后,我上传了您的 htaccess 代码,清除了缓存并尝试了路径 site.com/index.php?id=123。它会立即重定向到 site.com/?id=123 并仅显示首页,就像您访问 site.com 时一样。它不显示 123.html 页面。还有其他想法吗?我应该注意我在共享主机上,如果这有什么不同的话。再次感谢。
  • 嗯......它正在我的开发盒上工作;如果您在同一个(根)目录中拥有所有文件(index.php、.htaccess 和 123.html),那么应该没问题 - 共享主机不应该有任何区别。可能是您的 .htaccess 文件中的其他内容破坏了它......也许......
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多