4

我很难让几个 mod_rewrite 规则在我的 .htaccess 文件中一起工作。在整个网站中,我想删除“www”。来自所有 URL。我在文档根目录使用以下内容:

Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301]

然后,在一个文件夹“/help”中,我想做 2 次重写:

  1. 将 domain.com/help/1 更改domain.com/index.php?question=1
  2. 将 domain.com/help/category/example 更改domain.com/index.php?category=example

所以在 domain.com/help 我有以下内容:

Options +FollowSymLinks
RewriteRule ^([0-9]+)/?$ index.php?question=$1 [NC,L]
RewriteRule ^category/([^/\.]+)/?$ index.php?category=$1 [NC,L]

以上 2 个 .htaccess 文件适用于:
www.domain.comdomain.com
domain.com/help/1domain.com/index.php?question=1
domain.com/help/category/exampledomain.com /index.php?category=example

但是,当我需要结合 2 次重写以删除“www”时,这不起作用。并将子文件夹重写为 url 变量。例如:
www.domain.com/help/1domain.com/index.php?question=1
给出 500 错误。

我哪里做错了?而且,这最好与 2 个 .htaccess 文件一起使用,还是可以/应该将 2 个文件合并到文档根目录下的 1 个 .htaccess 文件中?

4

1 回答 1

2

看起来正在发生的事情是/help文件夹中的 .htaccess 文件中的规则正在应用,因为您在该文件夹中请求某些内容,因此不会应用父文件夹的规则。RewriteOptions Inherit如果您在/help文件夹的 .htaccess中添加一个,则可以传递您的父规则:

Options +FollowSymLinks
RewriteOptions Inherit
RewriteRule ^([0-9]+)/?$ index.php?question=$1 [NC,L]
RewriteRule ^category/([^/\.]+)/?$ index.php?category=$1 [NC,L]

但是,继承的规则可能不会按照您期望的顺序应用。例如,如果您请求http://www.domain.com/help/1/您最终会被重定向到http://domain.com/index.php?question=1这可能不是您想要的如果您试图通过隐藏查询字符串来制作对 SEO 友好的 URL。

您最好的选择可能是将/help文件夹中的内容移动到文档根目录中的内容,以便您可以控制应用规则的顺序:

Options +FollowSymLinks

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301]

RewriteRule ^help/([0-9]+)/?$ /index.php?question=$1 [NC,L]
RewriteRule ^help/category/([^/\.]+)/?$ /index.php?category=$1 [NC,L]

这样可以确保首先重定向到非 www 域,然后应用/help规则。因此,当您访问http://www.domain.com/help/1/时,您首先会被重定向到http://domain.com/help/1/,然后会应用帮助规则并将 URI 重写为/index.php?question=1.

于 2012-04-11T04:33:04.193 回答