Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess htaccess规则对URL的意外重写_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess htaccess规则对URL的意外重写

.htaccess htaccess规则对URL的意外重写,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我已经解决了我的问题,我有一个具体的问题 如果我在www.mysite.com/url2中键入URL,那么在中只有以下代码,

我已经解决了我的问题,我有一个具体的问题

如果我在
www.mysite.com/url2
中键入URL,那么在
中只有以下代码,
为什么会调用
index2.php

RewriteEngine On
RewriteCond %{REQUEST_URI} (.html|.htm|.feed|.pdf|.raw)$  [NC]
RewriteRule (.*) index2.php [L]
我也在进行了测试,不应将其替换为index2.php:

最后,我希望此规则跳过任何以/url2或/url2/*开头的URL。

编辑:我已经对这个问题进行了屏幕记录:

如果这是唯一的规则,则您列出的规则。事实上,这个理论很有趣,但显然它并没有像预期的那样起作用。请注意,
将匹配任何字符。如果要匹配句号/句点字符,则需要将其转义。这就是为什么我在下面使用
\(html | htm | feed | pdf | raw)$
而不是
(.html |.htm |.feed |.pdf |.raw)$


您可以添加另一个
RewriteCond
,如果url以/url2开头,则它根本不匹配,如下所示。如果有很多URL不应该匹配,那么这可能不是一个可行的解决方案

RewriteCond %{REQUEST_URI} !^/url2
RewriteCond %{REQUEST_URI} \.(html|htm|feed|pdf|raw)$ [NC]
RewriteRule (.*) index2.php [L]

为了更好地理解正在发生的事情,您可以将规则更改为如下内容。现在只需在url栏中输入不希望匹配的url,并在重定向发生后检查url栏。在url参数中,您现在可以看到实际触发此规则的url。向您展示了一个类似的版本,该版本使用的是一个正在url上运行的偷偷重写规则

#A way of finding out what is -actually- matched
RewriteCond %{REQUEST_URI} \.(html|htm|feed|pdf|raw)$ [NC]
RewriteCond %{REQUEST_URI} !/foo
RewriteRule (.*) /foo?url=$1 [R,L]

您可以决定匹配
%{the_REQUEST}
变量。这将始终包含请求本身。如果有其他内容正在重写url,则此变量不会更改,这意味着您可以使用它来覆盖任何更改。确保url不会与自身匹配。你会得到下面这样的结果。可以找到一个示例屏幕广播


您的
.htaccess
中有以下内容:

RewriteEngine On
RewriteCond %{REQUEST_URI} (.html|.htm|.feed|.pdf|.raw)$  [NC]
RewriteRule (.*) index2.php [L]
它是干什么的?它将以htmlhtm提要pdfraw结尾的任何内容重写为
index2.php
。因此,如果您在URL以这些扩展名结尾时得到结果,那么有两种可能的答案:

  • 在上层目录(或服务器配置文件)中的
    .htaccess
    中有另一条重写规则,导致URL被重写
  • 您的URL实际上以这些扩展名结尾。请记住,您在地址栏中输入的内容将被编辑和重写。例如,如果在地址栏中输入
    www.mysite.com/url2
    ,而服务器上不存在该文件,则服务器将尝试加载正确的错误文档。因此,如果您的错误文档是
    /404.html
    ,那么它将在最后被重写为
    index2.php

  • 更新: 我想是这样的。在文档根目录中创建一个名为
    404.php
    的文件。在主
    .htaccess
    (文档根目录)中,放置以下内容:

    ErrorDocument 404 /404.php
    
    <?php
        echo 'From 404.php file';
    ?>
    
    删除所有其他
    ErrorDocument
    指令。 在
    404.php
    中,放置以下内容:

    ErrorDocument 404 /404.php
    
    <?php
        echo 'From 404.php file';
    ?>
    
    小心:上面的代码将启用重写日志,并在可能的最高级别开始日志记录(记录所有内容)。这会降低服务器速度,并且日志文件会很快变大。仅在dev服务器上执行此操作

    解释:当您尝试访问
    www.mysite.com/url2
    时,Apache会提供您的URL以重写模块。“重写”模块检查是否有任何
    重写规则
    适用于您的URL。因为您有一条规则,但它不适用于您的URL,所以它会尝试加载普通文件。但此文件不退出。因此,Apache将执行下一步,即显示正确的错误消息。设置自定义错误文件时,Apache将针对新地址运行测试。例如,如果错误文档为/404.html,Apache将检查您的规则是否适用于/404.html。既然这样,它就会重写它


    要记住的一点是,每当URL发生更改时,apache都会这样做,无论更改是否由重写模块进行

    RewriteLog
    的输出是什么?我无法将其放入httpd.conf,因为我没有这样做的权限。您希望www.mysite.com/url2重定向到什么?所有内容都被路由到index2.php,因为您本质上说的是获取所有页面(由“(.*)”描述)并将流量转发到“index2.php”。我希望根据上述规则跳过像/url2/*这样的内容。但它正在重写为index2.phpI。我认为您应该清除.htaccess文件。然后重试。我已在此处进行屏幕录制:。我认为你们的观点不适用。按照我在更新部分所说的去做,让我知道会发生什么。我确信我所说的原因是因为在重命名文件后(该文件类似于
    asas…
    ),您收到了
    404
    错误。但请注意,在页面底部,它表示无法访问设置为用于404错误的文件!我有很多其他网站在运行。。如果我把它放在public_html中会影响他们吗?如果他们有相同的文档根,是的。否则不行!我已经按照您在“更新”中的要求完成了,现在/url2正在输出:“From 404.php文件”。你能添加这个逻辑的参考吗?我会查到你的答案。。谢谢这一定是今年的难题。