当前位置: 首页 > 知识库问答 >
问题:

HTAccess-重写所有文件index.php除了sitemap.xml

柯鸿振
2023-03-14

我正在尝试将每个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个答案

周超英
2023-03-14

sitemap.xml正在被重写为sitemap/sitemap.php,但随后重写过程重新开始(在.htaccess中),然后在第二次通过时将sitemap/sitemap.php重写为index.php

您应该在文件的顶部包含一个“异常”,用于您希望允许直接访问的任何现有的. php文件。例如:

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

这将阻止后续指令处理/index.php/sitemap/sitemap.php(并重写为index.phpindex.php当前之所以“起作用”,仅仅是因为mod_rewrite稍后检测到您正在回写,并忽略了第二次重写。

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

旁白:我不确定这应该是在做什么,但我不认为这是在做你认为它正在做的事情?事实上,我不认为这有什么用!?这里要关注的是CondPattern上的尾随反斜杠(转义字符)。看起来您正试图匹配请求URL之后(和协议之前)的空间,但这并不是在CondPattern的末尾发生的事情。“问题”是空间也是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标志大多是多余的,除非您还试图捕获无效的请求?任何合法的浏览器请求都将使用大写的html" target="_blank">方法和协议。

但是,如果这确实匹配(与尾随空格),那么您将获得一个重定向循环,用于任何不包含的URL。(文字点)。所以,不管怎样,它看起来都不正确。(?)

东门航
2023-03-14

您需要一个额外的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]
 类似资料:
  • 问题内容: 我正在写一个简单的基于PHP的MVC-ish框架。我希望该框架能够安装在任何目录中。 我的PHP脚本抓取了请求uri并将其分为多个部分。它使段1成为控制器,而段2成为动作。当我这样做时,一切都很好 它将转到特定的模块控制器和方法。现在,我有一个默认控制器,即home控制器,它位于文件夹home中。 ,它将显示403禁止,因为此文件夹确实存在,相反,它也应该返回如果我将框架安装在其他文件

  • 我希望你能帮忙。我试图写一个htaccess文件做以下事情。 1)重定向到www.地址 2) 从url中删除.php 3) 如果文件不存在,则使用filechecker.php?page=filename 1.我能忍受 RewriteCond%{HTTP_HOST}^example.com$ *)http://www.example.com/1美元[R=301, L] 2) 我受够了 Rewrit

  • 嗯,我的.htaccess有问题,我想重写这个: http://domain.com/a/thread-103518.html#103518 对这个 http://domain.com/a/103518 换句话说。。。我想删除“thread-”和“.”后面的所有内容,/a/必须是变量。。。还有其他带有/bla/和/code的论坛/ 你有什么线索给我吗?非常感谢。 我的.htaccess现在: 重写

  • 我的主托管域需要ssl,所以htaccess将每个url请求转换为https。 但我在同一个托管另一个域上使用cpanel dir结构(“public_html/addon domain.com”) htaccesspublic_html是我唯一能配置的。因此,当用户键入www.addondoamin.com或没有www时,htaccess将不会做任何事情。o/w,我得到了许多错误和addon域镜

  • 问题内容: 我有一个index.php,它处理所有路由index.php?page = controller(简体)只是为了与视图分离逻辑。 我无法与Rewriterule一起使用。 控制器可能如下所示: 并且: 问题答案: 基本上人们想说的是,您可以像这样编写重写规则: 这将使您的实际php文件如下所示: 您的实际网址如下所示: 在您的PHP文件中,您可以通过如下分解方式来访问参数:

  • 我需要一个解决方案。需要重写两个URL: 到 我尝试了许多不同的解决方案,但没有一个奏效。然而,我确实重写了这些网址,就像我说的,但是我的页面没有打开,所以我想它都在细节中。 对于提示: > onama.php和pravila.php文件位于/pages/目录中 编辑: 我想我很幸运:)用这个再试了一次,它成功了,我不擅长.htaccess规则,但这是我问题的解决方案: 编辑(新问题) 我试图制定