【问题标题】:Do I always need RewriteCond?我总是需要 RewriteCond 吗?
【发布时间】:2015-04-18 15:59:31
【问题描述】:

我的 .htaccess 文件中有这个 sn-p:

RewriteCond %{QUERY_STRING} id=([0-9]+)
RewriteRule ^(20\d\d)/page/([0-9]+)/$ ?yearMeasure=$1&page=$2 [L]
RewriteRule ^(20\d\d)/$ ?yearMeasure=$1 [L]
RewriteRule ^category/([A-Za-z0-9-]+)/page/([0-9]+)/$ ?category=$1&page=$2 [L]
RewriteRule ^category/([A-Za-z0-9-]+)/$ ?category=$1 [L]
RewriteRule ^(20\d\d)/([A-Za-z0-9-]+)/$ ?type=post&year=$1&title=$2 [L,QSA]

但是,当我删除第一行时,网站的行为仍然相同。 URL 仍然保持“干净”。这让我想到了我的问题;这个sn-p中RewriteCond的意义是什么?

此 RewriteCond 影响的唯一 RewriteRule 是:

RewriteRule ^page/([0-9]+)/$ ?page=$1 [L]

...当我尝试访问 /page/2/ 时,它不起作用。

当我将它移到 RewriteCond 上方时,如下所示:

RewriteRule ^page/([0-9]+)/$ ?page=$1 [L]

RewriteCond %{QUERY_STRING} id=([0-9]+)
RewriteRule ^(20\d\d)/page/([0-9]+)/$ ?yearMeasure=$1&page=$2 [L]
RewriteRule ^(20\d\d)/$ ?yearMeasure=$1 [L]
RewriteRule ^category/([A-Za-z0-9-]+)/page/([0-9]+)/$ ?category=$1&page=$2 [L]
RewriteRule ^category/([A-Za-z0-9-]+)/$ ?category=$1 [L]
RewriteRule ^(20\d\d)/([A-Za-z0-9-]+)/$ ?type=post&year=$1&title=$2 [L,QSA]

...一切恢复正常。为什么?

【问题讨论】:

  • 每个RewriteRule 都支持特定类型的 URL。如果您提供所有这些案例,那么将更容易理解并建议是否需要RewriteCond。

标签: .htaccess mod-rewrite


【解决方案1】:

在文档中RewriteRule 是这样定义的:

RewriteRule Pattern Substitution [flags]

如果Pattern 与请求的url 匹配(domain.com/path/file.cgi),则将url 替换为Substitution(返回重定向标头或url根据标志在内部进行更改)

这个重写规则:

RewriteRule ^(20\d\d)/page/([0-9]+)/$ ?yearMeasure=$1&page=$2 [L]

将检查 url 是否与模式匹配,并且仅在这种情况下才会发生替换。这就是为什么这里这样的RewriteCond 是没用的:

RewriteCond %{QUERY_STRING} id=([0-9]+)

这在RewriteRule 无法捕获的情况下很有用,例如检查主机名或文件是否存在:

RewriteCond %{HTTP_HOST} !^example.com$ [NC]
RewriteRule .? http://example.com%{REQUEST_URI} [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  

http://www.sitepoint.com/apache-mod_rewrite-examples-2/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多