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

我试图将每个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]

你需要一个额外的RewriteCond来排除sitemap.php,否则当sitemap.php被请求时,它将满足两个条件!-d-f并且将被重写为index.php

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

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

您应该在文件的顶部为任何您想允许直接访问的现有.php文件包含一个“例外”。 例如:

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

这会阻止/index.php/sitemap/sitemap.php/sitemap/sitemap.php的指令处理(并被重写为index.php )。 index.php目前“有效”,只是因为mod_rewrite后来检测到你正在写回自己并忽略第二次重写。


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

除此之外:我不确定这是应该做什么,但我不认为这是做你认为它在做什么? 事实上,我不认为这是在做什么!? CondPattern上的尾部反斜杠(escape char)是这里的关注点。 看起来你正在尝试匹配请求URL(和协议之前)之后的空间,但这不是CondPattern结尾处会发生的事情。 “问题”是空间也是Apache配置文件中的参数分隔符。 为了匹配模式末尾的空格,您应该使用s (任何空格字符)速记字符类,或者将CondPattern用双引号引起来,或者包含协议的前几个字符(例如HTTP )。 例如:

  • RewriteCond %{THE_REQUEST} ^[AZ]{3,}s([^.]+)s
  • RewriteCond %{THE_REQUEST} "^[AZ]{3,}s([^.]+) " (如果用双引号括起来,则转义空格是可选的)
  • RewriteCond %{THE_REQUEST} ^[AZ]{3,}s([^.]+) HTTP
  • NC标志大部分是多余的,除非你也试图捕获无效请求? 任何合法的浏览器请求都将使方法和协议全部大写。

    但是,如果这匹配(与尾部空格)匹配,那么对于任何不包含a的URL,您都将获得重定向循环. (字面点)。 所以无论如何,这看起来不正确。 (?)

    链接地址: http://www.djcxy.com/p/36549.html

    上一篇: Rewrite all files to index.php except sitemap.xml

    下一篇: Multiple languages + Htaccess