【问题标题】:htaccess for subdomain and url rewritehtaccess 用于子域和 url 重写
【发布时间】:2012-04-03 13:03:06
【问题描述】:

我遇到了这个 .htaccess 的问题

RewriteCond %{HTTP_HOST} appname.domain.com
RewriteCond %{REQUEST_URI} !appname/
RewriteRule ^(.*)$ /appname/$1 [L]

在文档根目录(不是真正的根文档,假设是一个 v-domain 文件夹)我有一个名为“appname”的文件夹。在 appname.domain.com 上,一切正常。现在我的问题是当我想做这样的事情时

http://appname.domain.com/somefolder

我不希望 url 被重写 appname.domain.com/appname/somefolder 在网址栏中。 有什么帮助吗?

更新: 在文档根目录中我有

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC]
RewriteCond %{REQUEST_URI} !^v-domain/
RewriteRule ^(.*)$  /v-domain/$1 [L]

在 v 域中

RewriteEngine On
RewriteBase /v-domain/

RewriteCond %{HTTP_HOST} appname.domain.com
RewriteCond %{REQUEST_URI} !appname/
RewriteRule ^(.*)$ /appname/$1 [L]
RewriteCond %{HTTP_HOST} appname.domain.com
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^appname/(.+)$ http://appname.domain.com/$1/    [R=301,L]
###################
RewriteCond %{HTTP_HOST} appname2.domain.com
RewriteCond %{REQUEST_URI} !appname2/
RewriteRule ^(.*)$ /appname2/$1 [L]
RewriteCond %{HTTP_HOST} appname2.domain.com
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^appname2/(.+)$ http://appname2.domain.com/$1/  [R=301,L]

【问题讨论】:

  • 当我将这些规则放在我的 .htaccess 文件中时,它们似乎像您预期的那样工作。
  • 尝试在您的子域文件夹中创建一个包含索引的目录,然后尝试访问该路径。您将看到 url 以“appname.domain.com/appname/somefolder”的丑陋方式重写

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


【解决方案1】:

尝试在您的子域文件夹中创建一个包含索引的目录,然后尝试访问该路径。您将看到 url 以“appname.domain.com/appname/somefolder”的丑陋方式重写

这听起来像是mod_dir's DirectorySlash 干扰。启用 DirectorySlash 后,如果 mod_dir 发现对目录的请求并且缺少尾部斜杠,它会将浏览器 重定向 到等效 URL 以包含尾部斜杠。

您可以做的就是转为DirectorySlash off,但在涉及 DirectoryIndex'ing 时存在披露问题(请参阅 mod_dir 中的 DirectorySlash 条目)。您可以尝试添加一些规则来为您执行此重定向,但请确保重定向 URL 中没有 /appname/ 位:

RewriteCond %{HTTP_HOST} appname.domain.com
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^appname/(.+)$ http://appname.domain.com/$1/    [R=301,L]

这主要检查请求是否针对主机appname.domain.com,请求的实体是目录,请求是否以斜杠结尾,以及请求是否已经为/appname/ 重写,将浏览器重定向到相同的 URL(不带 appname),但尾部带有斜杠。重定向后,您拥有的第一条规则将在内部重写 URI 以包含 /appname/,但由于请求现在以斜杠结尾,所以 mod_dir 应该忽略它。

【讨论】:

  • 这样appname.domain.com/folder(不带斜杠)最终会出现禁止错误。
  • 如果 appname 文件夹放在根目录下,一切正常。在我的情况下,文档根目录中的 v-domain 文件夹包含其中的所有子域文件夹,例如/v-domain/appname、/v-domain/appname2、/v-domain/appname3。我如何编辑这些规则以正常使用这些路径?例如/v-domain/appname/folder.
  • 此外,我希望将 url 重写的两个部分分开。在我的文档根目录中,我有这个 htaccess 将所有非子域请求重定向到 v-domain 文件夹:RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC] RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com$ [NC] RewriteCond %{REQUEST_URI} !^v-domain/ RewriteRule ^(.*)$ /v-domain/$1 [L] 然后我想将子域重写规则放在 v-domain 文件夹中。 @乔恩
  • 尝试将RewriteBase /v-domain/ 添加到规则顶部(在 v-domain 文件夹中的 .htaccess 文件中)。
  • 非常感谢。我注意到的最后一个问题是,当我在文档根目录中有一个名为 appname 的文件夹(与 v-domain 中的子域文件夹同名)时,重写规则将 appname.domain.com 重定向到 /appname 而不是 /v-domain/appname .不明白为什么
猜你喜欢
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多