【问题标题】:Apache vhost conflicts with CI .htaccessApache vhost 与 CI .htaccess 冲突
【发布时间】:2019-07-11 06:13:01
【问题描述】:

我正在通过Apache vhost 文件中的以下代码将我网站的子文件夹重写为子域:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. example.com
RewriteCond %{HTTP_HOST} ^(www\.)?(([^\.]+)\.){1}example.com$
RewriteCond /var/www/example.com/web/crm/build/%3 -d
RewriteRule ^/(.*) /crm/build/%3/$1

所以https://example.com/web/crm/folder = https://folder.example.com

我也使用.htaccess 将/index.php/ 隐藏在codeigniter url 中

RewriteEngine on
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L,QSA]
AddDefaultCharset utf-8

example.com/web/crm/folder 工作正常

folder.example.com 我得到 505 内部错误,一旦我删除 .htaccess 中的行或只是通过 folder.example.com/index.php/ 简单访问网站(日志中没有显示任何内容),该错误就会好起来

我想修复子域的重写冲突

【问题讨论】:

    标签: php apache .htaccess codeigniter mod-rewrite


    【解决方案1】:

    好的,有两个建议:

    1. 很高兴知道导致 HTTP 505 的特定服务器端错误。

      请将您服务器日志中的确切消息复制/粘贴到您的帖子中。

    2. 如果您能确切地知道您的重写规则是如何被解释的,那就太好了。

      请按如下方式启用日志记录:

    How to debug Apache mod_rewrite

    Apache Module mod_rewrite

    mod_rewrite 在 trace1 提供其操作的详细日志记录到 trace8 日志级别。日志级别可以专门为 mod_rewrite 使用 LogLevel 指令:最高级别调试,否 记录操作,而 trace8 意味着几乎所有操作 已记录。

    例子

    LogLevel alert rewrite:trace6
    

    George Samarguliani 添加了这条评论,解释了 HTTP 505 错误:

    在 vhost 文件 Job 中添加重写日志规则后,apache 不启动 用于 httpd.service 失败,因为控制进程以错误退出 代码。请参阅“systemctl status httpd.service”和“journalctl -xe”了解 详情。

    我将上面的 vhost sn-p 复制/粘贴到第一个方便的 Apache 配置验证器 https://htaccess.madewithlove.be/ 中,得到了这个:

    所以现在至少我们知道导致服务器端错误的原因:Apache vhost 配置。

    新建议:

    1. 就“index.php”而言,我什至认为您不需要或想要重写规则。

      只需配置“DirectoryIndex”,如下所示:

      <Directory /myapp>
        DirectoryIndex index.php
      </Directory>
      
    2. 至于 URL 的其余部分(例如 ``http://example.com/web/crm/build/`),请在您的帖子中更新您希望重定向实际工作的前后示例。

    3. 有很多很好的“howtos”,有很好的例子,用于使用 .httaccess/mod_rewrite 规则。例如:

    【讨论】:

    • 您好,感谢您的友好回复。在 vhost 文件中添加重写日志规则后,apache 未启动 httpd.service 的作业失败,因为控制进程退出并显示错误代码。有关详细信息,请参阅“systemctl status httpd.service”和“journalctl -xe”。参考上面提到的服务器日志没有记录
    • "Apache 没有启动...因为 vhosts" 。 Sooooo ...这是一个有趣的细节!在上面查看我的更新
    【解决方案2】:

    固定

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteBase /
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php?/$1 [L]
    </IfModule>
    
    <IfModule !mod_rewrite.c>
      ErrorDocument 404 /index.php
    </IfModule>
    

    【讨论】:

    • 不客气? ALSO: 问:你有没有想过你DON'T有mod_rewrite的情况?那真的很重要吗?问:差异可能是“最小的”,并且在任何一种情况下都有优点/缺点......但一般来说,为“DirectoryIndex index.php”配置VHost更有效,并让用户提供类似“mysite”的URL .com/myapp/",比重写index.php。
    • 嗯,DirectoryIndex不是指定目录的索引文件吗?在 codeigniter 中,所有查询都通过 index.php 运行,例如 example.com/index.php?/controller 和上面的 htaccess 只是从 url 字符串中隐藏 index.php。不确定 directoryindex 是否可以做到这一点。正如您从原始问题中看到的那样,子域没有专用的虚拟主机文件,它们作为 example.com 虚拟主机文件的通配符工作。
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 2014-07-02
    • 2021-07-02
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多