将所有文件重写为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,您都将获得重定向循环.
(字面点)。 所以无论如何,这看起来不正确。 (?)