是否可以在htaccess中嵌套重写条件?

时间:2012-12-25 13:03:41

标签: .htaccess

我有以下情况我想要嵌套的重写条件,我遇到过一种情况,我无法看到相同的文档。

RewriteCond %{REQUEST_URI} ^(robots.txt|favicon|ico)$ [NC]
RewriteRule . - [S=3]
# Nested ReWrite Condition 
RewriteCond %{HTTP_HOST} ^www
    RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI_1} [R=301,L]
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI_2} [R=301,L] # and so on

因此,问题在于跳过规则的数量是否包含嵌套的重写条件,也就是说,在这种情况下,跳过的重写规则的数量是4还是5(如果包括重写条件)。

2 个答案:

答案 0 :(得分:2)

RewriteCond %{REQUEST_URI} ^(robots.txt|favicon|ico)$ [NC]
RewriteCond %{HTTP_HOST} !^www
RewriteRule .* - [S=3]

# the following rules are run only if the first 2 conditions don't match
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI_1} [R=301,L]
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI_2} [R=301,L]

注意第二个cond中的!否定 documentation

  

这种技术很有用,因为RewriteCond仅适用于   紧随其后的RewriteRule。因此,如果你想做一个   RewriteCond适用于几种RewriteRules,一种可能的技术是   否定这些条件并添加带有[Skip]标志的RewriteRule。

答案 1 :(得分:1)

好的,因为您只发布了一个示例,我向您展示了它的工作原理。这是评论,但如果你仍然没有找到足够的说法,可以提供更多的解释here

# Does the file exist?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Create an if-then-else construct by skipping 3 lines if we meant to 
# go to the "else" stanza.
RewriteRule .? - [S=3]

# IF the file exists, then:
    RewriteRule (.*\.gif) images.php?$1
    RewriteRule (.*\.html) docs.php?$1
    # Skip past the "else" stanza.
    RewriteRule .? - [S=1]
# ELSE...
    Rewri

这应该可以解决您的问题。如果没有,请在问题中更新您的示例,以便明确您缺少的内容。

是的,它会跳过规则而不是条件