.htaccess 我总是需要重写吗?
我的.htaccess文件中有以下代码段:.htaccess 我总是需要重写吗?,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我的.htaccess文件中有以下代码段: 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&pag
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仍然保持“干净”;在这个片段中重写cond的意义是什么
此重写条件影响的唯一重写规则是:
RewriteRule ^page/([0-9]+)/$ ?page=$1 [L]
…当我试图访问/page/2/
时,它不起作用
当我将其移到重写条件上方时,如下所示:
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 Pattern Substitution [flags]
如果模式
与请求的url(domain.com/path/file.cgi)匹配,则url将替换为替换
(返回重定向标头或根据标志在内部更改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
每个
重写规则都支持特定类型的URL。如果您提供了所有这些案例,那么就更容易理解并建议是否需要重写cond。