如何在.htaccess中编写“if ... else”mod_rewrite语句

时间:2012-07-17 18:30:21

标签: apache .htaccess .htpasswd

我已经搜索了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]

2 个答案:

答案 0 :(得分:5)

如果您使用的是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>

答案 1 :(得分:2)

您正在尝试使用[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次跳过后停止跳过,其中在S =部分之后定义N.这是您的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]