3

我已经在 StackOverflow 上搜索了这个问题的答案,并且看到很多问题都接近了,但还没有什么对我有用。

我想让我.htaccess根据调用它的域应用不同的规则。基本上,如果 subdomain.example.com 被命中,重定向到 google.com。如果 localhost 被命中,重定向到 yahoo.com。如果 www.example.com(或 example.com)被点击,重定向到 bing.com。

稍后我将添加实际的重写规则(设置环境变量和 htpasswd 保护),但首先我需要让“if then”部分正常工作。

我的(非工作)代码如下。任何帮助是极大的赞赏。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteRule http://google.com/ [L,R=301]

RewriteCond %{HTTP_HOST} ^localhost$
RewriteRule http://yahoo.com/ [L,R=301]

RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$
RewriteRule http://bing.com/ [L,R=301]

编辑:根据下面 Barta 的评论更新(但仍然无效)代码。

RewriteEngine On

RewriteCond %{HTTP_HOST} ^subdomain\.domain\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=1]
RewriteRule ^(.*)$ /index.php/$1 [L]

RewriteCond %{HTTP_HOST} ^localhost$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=7]
RewriteRule ^(.*)$ /subdir/www/index.php/$1 [L]
RewriteRule ^ - [E=MYSQL_DB_HOST:localhost]
RewriteRule ^ - [E=MYSQL_DB_NAME:XXX]
RewriteRule ^ - [E=MYSQL_USERNAME:XXX]
RewriteRule ^ - [E=MYSQL_PASSWORD:XXX]
RewriteRule ^ - [E=BASE_URL:XXX]
RewriteRule ^ - [E=ENVIRONMENT:XXX]

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=1]
RewriteRule ^(.*)$ /index.php/$1 [L]
4

2 回答 2

8

如果您使用的是 Apache 2.4,您可能会发现这很有用。

如果通过 HTTPS 连接,我的服务器会设置一个环境变量HTTPS,尽管有不同的方法可以获取它。我的目标是强制 HTTP 身份验证,但仅限于安全连接并将非安全连接重定向到安全位置。

<If "%{HTTPS} == 'on'">
  AuthName "Files are protected, enter your normal website email and password"
  AuthType Basic
  AuthUserFile /home/sites/mysite.co.uk/.htpasswd
  Require valid-user
</If>
<Else>
  RewriteEngine On
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</Else>
于 2014-05-27T20:40:16.213 回答
4

您正在尝试使用 [L,R=301] 标志将http://bing.com重写为 [L,R=301] 而不是http://bing.com的任何内容。尝试RewriteRule ^(.*)$ http://bing.com/ [L,R=301]

关于 IF-ELSE:像这样在 RewriteRule 上使用 S 标志:

RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteRule .? - [S=<here comes the number of your directives in the "else" part>]
# Here comes your ELSE part:
# Etc. etc.
RewriteRule .? - [S=<here comes the number of your directives in the "if" part>]
# Here comes your IF part.

在上面的示例中,如果您的 RewriteCONd 匹配,则带有 S 标志的 RewriteRule 将跳过以下指令并在第 N 次跳过后停止跳过,其中 N 在 S= 部分之后定义。这是你的 ELSE 部分。N 号应包括您的下一个跳过 IF 部分的 RewriteRule。

由于跳过,它们的顺序相反。如果您否定 RewriteCond,那么它们按正常顺序就可以了。

这是 Apache 文档中的原始示例: https ://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_s

编辑: 尝试这样的事情:

RewriteEngine On

RewriteCond %{HTTP_HOST} !^subdomain\.domain\.com$
RewriteRule .? - [S=1]
RewriteRule ^(.*)$ /index.php/$1 [L]

RewriteCond %{HTTP_HOST} !^localhost$
RewriteRule .? - [S=7]
RewriteRule ^(.*)$ /subdir/www/index.php/$1 [L]
RewriteRule ^ - [E=MYSQL_DB_HOST:localhost]
RewriteRule ^ - [E=MYSQL_DB_NAME:XXX]
RewriteRule ^ - [E=MYSQL_USERNAME:XXX]
RewriteRule ^ - [E=MYSQL_PASSWORD:XXX]
RewriteRule ^ - [E=BASE_URL:XXX]
RewriteRule ^ - [E=ENVIRONMENT:XXX]

RewriteCond %{HTTP_HOST} !^example\.com$
RewriteRule .? - [S=1]
RewriteRule ^(.*)$ /index.php/$1 [L]
于 2012-07-17T18:48:12.880 回答