.htaccess - 重定向多个页面

时间:2013-05-05 20:08:15

标签: apache .htaccess mod-rewrite url-rewriting

在周末的大部分时间里,我一直试图绕过.htaccess,但我一直在磕磕绊绊;我可以让服务器使用一组规则,但一次不能超过一个。

我的申请由几页组成:

  • 主页从详细信息页面(以及详细信息页面不包含的内容)中提取内容,并带有可选的查询字符串参数;例如?s=item-name
  • 详细信息页面提供了一个可选的查询字符串参数(与主页相同的参数;例如?s=item-name - 这将引用完全相同的内容)
  • 收集页面
  • 相关页面

这些页面中的每一个都是文档根目录中的php文件(index.php,detail.php,collection.php,相关的php)。

我想要实现的目标:

  • 用户应该可以转到mydomain.com/detail/mydomain.com/detail(因此允许使用尾随斜杠)而不是mydomain.com/details.php
  • 如果存在,则应在页面的尾部斜杠后输入查询字符串参数(?s=item-name)(mydomain.com/item-name而不是mydomain.com/?s=item-name; mydomain.com/detail/item-name而不是{{1所有页面都是这种情况,因此一次在一个页面上设置规则似乎相当麻烦......

这是我的.htaccess文件目前的样子,经过多次摆弄:

mydomain.com/detail.php?s=item-name

这允许主页提取正确的内容,我确信它不会让任何页面做同样的事情,但我无法理解它。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

RewriteEngine On
RewriteBase /

# Specifics
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/([^/]+)/(.+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^ %1.php?s=%2 [L]

# EDIT 1: This will also check for root pages. See notes below
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([^/]+)/ $1 [R=301,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.+) $1.php [L,QSA]

# Everything else
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L]

<强>解释

  1. 首先,我们检查完整的REQUEST_FILENAME是否存在。
  2. 然后,我们检查格式如下:/<something-without-slash>/<everything else>(带有可选的尾部斜杠)。
  3. 然后检查我们的第一个条件捕获是否作为文件根目录中的PHP文件存在。例如,如果我们请求foo/bar,则会检查/foo.php是否存在。
  4. 然后我们只需使用正确的查询字符串将请求路由到正确的文件。
  5. 因此,在您的情况下,当您请求detail/item-name时,服务器实际上会查看detail.php?s=item-name以向您提供回复。

    注意:如果它不存在,请求只会将请求发送到index.php

    编辑已添加对根页面的检测。但请注意,我无法为此类检测留下斜线,因为它会自动将.php修改为空s查询参数。不知道为什么...... 这就是为什么当它到达这个阶段时,它将删除任何尾部斜杠。这对SEO评级/排名也有好处,因为它被视为一页,而不是两个重复。