htaccess - 将所有文件重写为index.php,sitemap.xml除外

时间:2017-10-22 17:18:41

标签: php xml apache .htaccess url-rewriting

我正在尝试将每个php文件重定向到index.php,除了sitemap.xml。问题是sitemap.xml也被重定向到index.php。 如何将所有php文件重定向到index.php和sitemap.xml到sitemap.php?

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\ [NC]
    RewriteRule ^ %1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^/?(.*)\.php$ index.php [L,QSA]
    RewriteRule sitemap.xml sitemap/sitemap.php [L]

2 个答案:

答案 0 :(得分:1)

您需要额外的RewriteCond来排除sitemap.php,否则当请求sitemap.php时,它将满足两个条件library(tidyverse) df %>% group_by(Name) %>% summarize(Value = toString(which(!(1:5 %in% Value)))) %>% separate_rows(Value) %>% mutate(Value = as.numeric(Value)) # A tibble: 6 × 2 Name Value <fctr> <dbl> 1 A 2 2 A 4 3 B 1 4 B 4 5 B 5 6 C NA !-d并将再次重写为index.php

-f

答案 1 :(得分:1)

sitemap.xml正在被重写为sitemap/sitemap.php,但随后重写过程(.htaccess)和sitemap/sitemap.php重新开始,然后被重写为index.php第二遍。

你应该包含一个&#34;例外&#34;在文件的顶部,您要允许直接访问的任何现有.php文件。例如:

RewriteRule ^(index|sitemap/sitemap)\.php$ - [L]

这将阻止/index.php/sitemap/sitemap.php被后面的指令处理(并被重写为index.php)。 index.php目前&#34;工作&#34;只是因为mod_rewrite后来检测到你正在回写自己而忽略了第二次重写。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\ [NC]
RewriteRule ^ %1 [R=301,L]

旁白:我不确定这应该是做什么的,但我不认为这是在做你认为它做的事情?事实上,我不认为这是任何事情!?这里关注 CondPattern 上的尾部反斜杠(转义字符)。看起来你试图在请求URL之后(和协议之前)匹配空间,但这不会发生在 CondPattern CondPattern 的结尾。 EM>。 &#34;问题&#34;是 space 也是Apache配置文件中的参数分隔符。为了匹配模式末尾的空间,您应该使用\s(任何空格字符)速记字符类,或者将其包含在内双引号中的 CondPattern ,或包含协议的前几个字符(例如HTTP)。例如:

  • RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\s
  • RewriteCond %{THE_REQUEST} "^[A-Z]{3,}\s([^.]+) "(如果用双引号括起来,则空格是可选的)
  • RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\ HTTP

除非您尝试捕获无效请求,否则NC标志大多是多余的?任何合法的浏览器请求都将使方法和协议全部为大写。

但是,如果这确实匹配(使用尾随空格),那么您将获得任何不包含.(文字点)的URL的重定向循环。所以,无论哪种方式,它看起来都不正确。 (?)