1

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

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个(如果包括重写条件)。

4

2 回答 2

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
文档中的否定:

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

于 2012-12-25T13:12:36.503 回答
1

好的,因为您只发布了一个示例,我将向您展示一个示例,它是如何工作的。它带有评论,但如果你仍然觉得它说得不够多,这里有更多的解释。

# 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

这应该可以解决您的问题。如果没有,请在问题中更新您的示例,以便清楚您缺少什么。

是的,它跳过了Rules而不是Conditions

于 2012-12-25T13:38:41.087 回答