1

为了便于维护,我将子网站组织到 LAMP 服务器上的不同文件夹中,但不希望最终用户知道它们是通过 URL 组织到这些文件夹中的。

目录结构示例:

/category1/website1
/category1/website2
/category2/website3
/category2/website4
/category2/website5
/category3/website6
/category4/website7
etc.

目前它显示为http://www.example.com/category1/website1但是我希望它一直显示http://www.example.com/website1- 即使他们将类别名称放在那里。

诀窍是我需要从一个.htaccess包含 X 个类别的文件中执行此操作,其中包含 X 个子网站。目前我正在使用

Redirect 301 /website1 /category1/website1

每个网站都允许用户使用较短的链接,但最终他们最终会看到地址中的类别,并且.htaccess文件很长,涉及 200 多个子网站。:(

任何帮助,将不胜感激!

4

2 回答 2

0

mod_rewrite如果您要手动输入它们,使用它非常简单:

RewriteEngine on
RewriteRule ^/website1$ /category1/website1 [L,NC]
RewriteRule ^/website2$ /category1/website2 [L,NC]

也可以创建一个RewriteMap文档中有很多有用的信息

希望有帮助。

于 2012-04-11T16:06:35.950 回答
0

由于没有可识别的“模式”将网站链接到类别子目录,并且您仅限于此,.htaccess因此您别无选择,只能手动列出.htaccess文件中的所有映射,就像列出重定向一样。

假设您想在内部将表单的 URL重写/website1/<something>/category1/website1/<something>- 与Redirect指令的工作方式相同(即前缀匹配)。

您可以在中执行以下操作.htaccess

RewriteEngine On

RewriteRule ^(website1/.*) /category1/$1 [L]
RewriteRule ^(website2/.*) /category1/$1 [L]

$1是对RewriteRule 模式中捕获的组的反向引用。例如。如果您请求/website1/foo,它将重写为/category1/website1/foo.

这确实要求您至少请求/website1/,并带有斜杠(因为这是一个目录)。

您可以将属于同一类别的网站组合在一起。例如:

RewriteRule ^((website3|website4|website5)/.*) /category2/$1 [L]

我希望它一直显示http://www.example.com/website1-即使他们将类别名称放在那里

为此,您需要实现反向...重定向以从 URL中删除类别。但是,一个额外的复杂性是您只想重定向直接请求而不是重写请求(如上所述)。

这需要在上面的内部重写之前进行。

除非有可辨别的模式来区分类别名称,否则您将需要为每个类别制定规则。例如:

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^category1/(.*) /$1 [R=302,L]

...并为每个类别重复。

REDIRECT_STATUS环境变量的检查确保我们只针对直接请求而不是重写请求。

将 302(临时)更改为 301(永久) - 如果这是有意的 - 只有在您确认它可以正常工作以避免缓存问题之后。

.htaccess但是,这可能更容易(并且更“可扩展”)在每个类别子目录中使用附加文件来实现。这将是每个类别子目录中的相同指令:

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=302,L]

由于RewriteRule 模式匹配的 URL 路径是相对于包含.htaccess文件的目录的,因此$1反向引用包含减去/category/前缀的 URL 路径。

于 2019-05-21T21:49:18.810 回答