我正在尝试将每个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]
答案 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的重定向循环。所以,无论哪种方式,它看起来都不正确。 (?)