如何解决CodeIgniter 4 的 apache conf不是 .htaccess的最佳 apache mod_rewrite 规则?
我正在尝试为我的基于 CodeIgniter 的网站获取最干净、最简单的 apache conf 文件,该文件以尽可能少的重定向完成以下任务:
- 针对裸域或任何子域的所有 HTTP 请求都重定向到 HTTPS
- 将 example.com 重定向到 www.example.com
- 请求 https://foo.example.com 重写 url 而不重定向到 https://www.example.com/subdomain/foo 但请求任何其他路径信息重定向。例如,https://foo.example.com/anything 将 301 重定向到 https://www.example.com/anything
- 重写网址以使用 CodeIgniter 4
- 对 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 举报,一经查实,本站将立刻删除。