Mod重写Wilcard子域 - 内部页面

时间:2016-05-31 08:46:02

标签: apache .htaccess mod-rewrite

  • 我可以通过$ _SERVER [“HTTP_HOST”]获取子域变量(产品名称和语言)

http://product.en.example.com

我不知道如何在浏览器中使用内部页面的这些网址:

  • product.en.example.com/images
  • product.en.example.com/images/john
  • product.en.example.com/hobbies
  • product.en.example.com/hobbies/smith

images,hobbies = pageType

john,smith = peopleName

我想我应该通过php查询字符串(GET)获取pageType并提供相应的布局。

在.htaccess中我有:

RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{REQUEST_URI} !index\.php
RewriteCond %{HTTP_HOST} ^(.+?)\.(.+?)\.example\.com/$ 
RewriteRule (.+).(.+)\.example\.com\/(.*) /index.php [L]

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现这一目标。首先,您可以使用包含请求的URI的$_SERVER['REQUEST_URI']在php中解析请求uri。

另一种方法是使用您的.htaccess文件。在这种情况下,您甚至不必解析php中的服务器名称:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{HTTP_HOST} ^(.*?)\.?([^\.]+?)\.example\.com$
RewriteRule ^([^/]*)?/?(.*?)/?$ /index.php?product=%1&language=%2&pageType=$1&peopleName=$2 [L]

请注意,我添加了规则RewriteCond %{REQUEST_FILENAME} !-f,而不是针对index.php的检查,因为这样您可以像css文件一样提供资源,而无需将其重定向到index.php。

请注意HTTP_HOST没有斜杠。

修改

根据评论的要求:

要添加其他可选参数,您可以使用([^/]*)?/?。因此RewriteRule可能如下所示:

RewriteRule ^([^/]*)?/?([^/]*)?/?(.*?)/?$ /index.php?product=%1&language=%2&pageType=$1&peopleName=$2&peopleAge=$3 [L]