如何使用.htaccess将静态重定向到动态URL(在Wordpress网站上)

时间:2015-04-30 14:54:07

标签: php wordpress .htaccess mod-rewrite redirect

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

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

旧的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

1 个答案:

答案 0 :(得分:1)

要将带有查询字符串的网址映射到实际文件,您需要使用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']来确定操作。

注意:但是,这不会阻止用户通过访问网址 www.site.com/123直接访问 123.html 。 HTML - 我一直陷入无限循环和Apache 500错误试图阻止:|