1

设想

我正在管理一个已移至基于 Wordpress 的设置的网站,但无法访问 Wordpress 中的所有管理工具(它是外部托管/管理的),但我确实可以访问 htaccess 文件。现在,我需要做两件事:

  1. 将旧页面重定向到新的 url 结构。
  2. 将所有 www 调用重定向到非 www。

挑战

但是,我想通过以下方式完成此操作:

  1. 每次调用最少可能的重定向(最好只有 1 个)。
  2. 规则重复有限。
  3. 有点可读性(不仅仅是一个内联正则表达式处理这一切)。
  4. 全部在 htaccess 中单独编辑。

让我很难过的是,当它既是旧网址,又以 www 为前缀时,将重定向保持在最低限度。

我的下一个最大问题是,我想使用重写映射,但似乎你必须从外部加载一些东西,而不是在我更喜欢的 htaccess 文件中定义字典。

更多细节

  • 我不是使用重写引擎的专家,所以我可能在这里遗漏了一个简单的解决方案。
  • 旧网站的结构很简单/index.php?page=<pageName>
  • 新网站使用 seo 友好的 url /a-new-url-example/
  • 两个例子可能是:
    1. mydomain.com/index.php?page=bootsmydomain.com/boots/
    2. www.mydomain.com/index.php?page=shoesmydomain.com/shiny-shoes/ (需要某种地图来处理shoes-> shiny-shoes
  • 我自己电脑上的当前设置不允许我在本地测试它(与其他项目有很多冲突),所以目前我正在使用http://htaccess.madewithlove.be/测试设置。
  • htaccess 文件的当前内容(在 pastebin 上,因为代码在这里一直被解释为其他内容)。
4

2 回答 2

2

正如您提供的那样,我希望这不会与您在 htaccess 中的现有规则发生冲突。

#exceptions first
RewriteCond %{QUERY_STRING} ^page=shoes3$ [NC]
RewriteRule ^index\.php$ /shiny-shoes/? [R=302]

#urls that directly map to the new url scheme
RewriteCond %{QUERY_STRING} ^page=(.*)$ [NC]
RewriteRule ^index\.php$ /%1/? [R=302]

#note the absence of the L flag in the above rules.
# from apache docs: the [R] flag prepends http://thishost[:thisport] to the URI, but then passes this on to the next rule in the ruleset

# no-www (make sure this is the last rule)
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^http://[^/]+/(.*)$ http://%1/$1 [R=302,L]
于 2012-11-28T16:44:01.327 回答
0

这是一个例子:

条件:

.1 具有这些规则的 .htaccess 文件位于根目录中。

.2 GET 值(以下示例中的“值”)未在请求的 URL 中修改。换句话说,请求的 URL 中的“shoes”是相同的,而不是问题中的“shiny-shoes”。这是可能的,但需要在模式中包含一个别名列表,或者每个项目的不同规则。

.3 根目录中的 index.php 脚本必须能够处理所有可能的值并在没有找到匹配项时加载正常页面(如果有)。

    RewriteEngine on
    Options +FollowSymLinks

    #Redirect from http://www.mydomain.com to http://mydomain.com
    RewriteCond %{HTTP_HOST} ^www\.mydomain\.com$ [NC]
    RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

    #mydomain.com/value/ to  mydomain.com/index.php?page=value
    RewriteRule ^(.*)?/$ index.php?page=$1 [L]

要测试此示例,请在根目录的 index.php 中仅包含以下代码:

    <?php
    if ( $_GET[ 'page' ] == 'value' ) { // Change "value" accordingly 
      echo "Processing item <br /><br />";
    }
    else {
      echo "Loading normal page<br /><br />";
    }
    ?>
于 2012-11-28T06:03:52.783 回答