微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CodeIgniter 4 的 apache conf不是 .htaccess的最佳 apache mod_rewrite 规则?

如何解决CodeIgniter 4 的 apache conf不是 .htaccess的最佳 apache mod_rewrite 规则?

我正在尝试为我的基于 CodeIgniter 的网站获取最干净、最简单的 apache conf 文件,该文件以尽可能少的重定向完成以下任务:

  1. 针对裸域或任何子域的所有 HTTP 请求都重定向到 HTTPS
  2. 将 example.com 重定向www.example.com
  3. 请求 https://foo.example.com 重写 url 而不重定向https://www.example.com/subdomain/foo 但请求任何其他路径信息重定向。例如,https://foo.example.com/anything 将 301 重定向https://www.example.com/anything
  4. 重写网址以使用 CodeIgniter 4
  5. 对 CSS、JS、图像、站点地图等的请求不会被重写。

我希望它在 conf 文件中,而不是在 .htaccess 文件 Apache says .htaccess 文件会导致性能下降:

如果您有权访问 httpd 主服务器配置文件,则应完全避免使用 .htaccess 文件

我目前有这个简单的 example.conf 用于端口 80:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias *.example.com
    DocumentRoot /var/www/example/public
    ServerAdmin webmaster@example.com
    UseCanonicalName Off

    # if ANY request comes to port 80,we want to redirect
    RewriteEngine On

    # all requests for bare domain redirect to www
    # sadly,we must refer to exact domains here rather than %{VARS}
    RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
    RewriteRule ^(.*)$ https://www.example.com$1 [R=301,QSA,END]

    # presumably any request in here (port 80) is NOT https so we don't need this
    #RewriteCond %{HTTPS} !=on
    # bare domains handled in prev rule,so redirect to HTTPS for requested domain
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,END]

    # i have no idea if the following directives ever come into play?
    <Directory /var/www/example/public>
        Options +FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    CustomLog /var/www/example/log/access.log combined
    ErrorLog /var/www/example/log/error.log
</VirtualHost>

Q1) 有一个单独的 80 端口和 443 端口 conf 文件有意义吗?

Q2) 我应该删除那里的部分吗?

对于我的 https/端口 443 conf,我有 example-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com
    DocumentRoot /var/www/example/public
    ServerAdmin webmaster@example.com
    UseCanonicalName Off

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/example/public>
        Options FollowSymLinks Multiviews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>


    ErrorLog /var/www/example/log/error.log
    CustomLog /var/www/example/log/ssl_access.log combined


    #   SSL Engine Switch:
    SSLEngine on
    SSLCertificateFile    /etc/ssl/certs/ssl-cert.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert.key

    <FilesMatch "\.(cgi|shtml|phtml|PHP)$">
        SSLOptions +StdEnvVars
    </FilesMatch>

    browserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    browserMatch "MSIE [17-9]" ssl-unclean-shutdown


    # taken from CodeIgniter .htaccess,massaged to canonicalize
    # www domain while allowing subdomains
    <IfModule mod_rewrite.c>
        RewriteEngine On

        # Redirect Trailing Slashes...
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)/$ $1 [L,R=301,END]

        # Rewrite "example.com" => "www.example.com"
        RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
        RewriteRule ^(.*)$ https://www.example.com%{REQUEST_URI} [R=301,END]

        # 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 the front controller,index.PHP
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ /index.PHP/$1 [L,NC,QSA]

    </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.
        ErrorDocument 404 index.PHP
    </IfModule>

</VirtualHost>
</IfModule>

Q3) 对 https://example.com/subdir/ 的请求需要两次重定向的结果,第一次删除尾部斜杠,第二次添加 www 以产生 https://www.example.com/subdir。这可以减少到一个重定向吗?请注意,我想要 301(永久)重定向用于 SEO 目的。

Q4) 删除尾部斜杠是否也需要 QSA?是否需要 www 重定向 QSA?

以及最重要的问题:

Q5) 为什么我的所有图像、css、js 等都得到 404?为什么要应用 index.PHP RewriteRule? RewriteCond !-f 不排除重写我的公共目录中存在的文件吗?

Q6) 什么规则会重写(但不重定向)任何子域,例如foo.example.com,to www.example.com/foo but重定向任何包含路径信息的此类请求,例如,foo.example.com/path 应该 301 重定向www.example.com/path

注意:尾部斜杠和 index.PHP 重写直接改编自 default CodeIgniter .htaccess file

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。