可扩展的URL重写规则

时间:2012-04-11 12:45:02

标签: apache .htaccess mod-rewrite

我将子网站组织到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多个子网站。 :(

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

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

也可以创建RewriteMapdocumention

中有很多有用的信息

希望有所帮助。

答案 1 :(得分:0)

由于没有可辨别的“样式”将网站链接到 category 子目录,并且您只能使用.htaccess,因此只能选择手动列出您的所有映射.htaccess文件,以与您列出重定向相同的方式。

假设您要内部重写/website1/<something>格式的URL改成/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后向引用包含URL路径减去/category/前缀。