Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 我总是需要重写吗?_.htaccess_Mod Rewrite - Fatal编程技术网

.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

我的.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&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。