【问题标题】:Codeigniter $config['uri_protocol'] problemCodeigniter $config['uri_protocol'] 问题
【发布时间】:2020-01-25 09:50:49
【问题描述】:

我需要将 $config['uri_protocol'] 从 AUTO 更改为 PATH_INFO(以允许 url 参数)

我的问题:当我设置$config['uri_protocol']="PATH_INFO"; 时,常规网址停止运行,无论我点击哪个网站页面网址,我都会获得主页。

print_r ($_SERVER) 显示我添加的 url 参数仅出现在 REQUEST_URI 中,而不出现在任何其他 $_SERVER 部分中。

我的 htaccess 是standard one

<IfModule mod_rewrite.c>
    RewriteEngine On

    # This is different between local host and production server!!!
    RewriteBase /


    #Removes access to the system folder by users.
    #Additionally this will allow you to create a System.php controller,
    #previously this would not have been possible.
    #'system' can be replaced if you have renamed your system folder.
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #Checks to see if the user is attempting to access a valid file,
    #such as an image or css document, if this isn't true it sends the
    #request to index.php
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    # If we don't have mod_rewrite installed, all 404's
    # can be sent to index.php, and everything works as normal.
    # Submitted by: ElliotHaughin

    ErrorDocument 404 /index.php
</IfModule> 

更新:

我变了

RewriteRule ^(.*)$ index.php?/$1 [L]

RewriteRule ^(.*)$ index.php?/$1 [QSA,L] 允许 url 参数通过。现在 url 参数也出现在

 $_SERVER

 REDIRECT_QUERY_STRING, QUERY_STRING AND REQUEST_URI

.

问题:我使用上述所有选项尝试了 $config['uri_protocol'],但每当我添加 URL 参数时,CI 仍然会给出错误 404。

注意:我在 2 台服务器上尝试了上述方法。其中一个是 centos5/Apache2/Plesk VPS,另一个是 xampp/Vista。

【问题讨论】:

    标签: .htaccess codeigniter


    【解决方案1】:

    我遇到了同样的问题,当我将 uri_protocol 设置为 PATH_INFO 时,我网站的所有链接都会转到默认控制器和操作。然后我发现我的服务器不支持PATH_INO变量,于是我在config.php做了两步解决问题:

    第一:

    $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
    

    然后:

    $config['uri_protocol'] = 'PATH_INFO';
    

    以上两行解决了我的问题。

    【讨论】:

    • 感谢这为我节省了很多时间!
    【解决方案2】:

    您可能应该在 mod_rewrite 的最后一条规则中使用 [QSA] 选项... 这会将查询字符串参数(我的意思是在“?”之后)附加到您的最终 URL。

    你的规则是这样结束的:

    RewriteRule ^(.*)$ index.php?baseurl=$1 [QSA,L]
    

    如果您的要求是:

    http://yourhost.com/module/action?param1=value1&param2=value2
    

    最后,你得到:

    http://yourhost.com/index.php?baseurl=/module/action&param1=value1&param2=value2
    

    我没有测试过。这是你真正想要的吗?

    【讨论】:

    • 嗨,Arno,感谢您的提示。并没有完全解决问题,请看原问题中的更新。
    • 您是否尝试过删除“?”之间的斜线。和“$1”?
    【解决方案3】:

    在这种情况下,您不想将 $config['uri_protocol'] 设置为 PATH_INFO。 var_dump($_SERVER) 某处并找到哪个变量包含您想要的路径,然后将其设置为该路径,如果 AUTO 不起作用。

    【讨论】:

      【解决方案4】:

      最好的方法是检查你从服务器获取的参数。

      如果您收到 $_SERVER['PATH_INFO'],请使用以下内容。

      $config['uri_protocol'] = 'PATH_INFO';
      

      否则,如果您收到 $_SERVER['ORIG_PATH_INFO'],请使用:

      $config['uri_protocol'] = 'ORIG_PATH_INFO';
      

      在您的配置文件中进行这些更改。

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 嘿,我刚刚通过谷歌找到了这个问题。我遇到了与您在此处描述的完全相同的问题。我需要使用 URL 查询字符串,但如果我将 $config['uri_protocol'] 更改为“PATH_INFO”(这是允许查询字符串工作所必需的),我的所有页面都会简单地重定向到主页。现在我按照您在此处提供的链接进行操作,但我不明白您的解决方案(而且它似乎对我不起作用)。请问您将 $config['uri_protocol'] 设置为什么以及您的 .htaccess 现在是什么样的?非常感谢。 :)
        • 抱歉,我想出了一个解决方案(hack hack hack :P)。我的主机(出于某种原因)不允许 PATH_INFO 变量。所以我只是将 ORIG_PATH_INFO 值复制到 PATH_INFO 变量中。瞧!
        • $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];很好用
        【解决方案6】:

        我的问题:当我设置$config['uri_protocol']="PATH_INFO"; 时,常规网址停止运行,无论我点击哪个网站页面网址,我都会获得主页。

        这可能是因为您实际上并未在 RewriteRule 指令中将 URL 路径作为 PATH_INFO 传递:

        RewriteRule ^(.*)$ index.php?/$1 [L]
        

        这里,URL 路径是作为 query_string 传递的,而 path_info 是 empty(这可以解释为什么所有请求最终都在您的主页上)。在这种情况下,您需要额外的 QSA 标志才能追加请求中的任何其他查询字符串(如您的问题中所述)。

        要将 URL 路径作为 path_info 传递(即附加路径名信息),您需要从 RewriteRule 中删除 ? 替换。 (然后您就不需要 QSA 标志,因为请求中的查询字符串将自动传递给 substitution。)

        例如,要使用 PATH_INFO,请像这样构造 RewriteRule 指令:

        RewriteRule (.*) index.php/$1 [L]
        

        正则表达式(.*)^(.*)$ 相同,因为默认情况下正则表达式是贪婪的。


        请注意,您的服务器还必须配置为接受路径信息(否则会触发自动 404)。默认情况下,这取决于关联的文件处理程序。默认情况下,与.php 文件关联的处理程序将接受路径信息。 (.html 文件不会。)但是,如果您需要明确启用此功能,请在您的 .htaccess 文件顶部添加以下内容:

        AcceptPathInfo On
        

        这将为所有 URL 启用路径信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          • 2011-02-07
          • 1970-01-01
          • 1970-01-01
          • 2012-10-27
          • 1970-01-01
          相关资源
          最近更新 更多