gpt4 book ai didi

apache - 安装 ssl 证书后 CMS 的重写规则失败

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:13 25 4
gpt4 key购买 nike

我编写了一个内容管理系统,它使用重写规则将 url 映射到 controlleractionargument 查询字符串。

我使用两个 .htaccess 文件。一个在我网站的根目录中。这个将所有请求转发到一个子目录,该子目录取决于用于请求的域名:

SetEnv HTTP_MOD_REWRITE On
RewriteEngine on

# mapp requests that don't start with www to https://www

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# BEGIN Domain to folder mapping

########################

# pointing example.com to subfolder 'example'
ReWriteCond %{HTTP_HOST} (www\.)?example.com
ReWriteCond %{REQUEST_URI} !example/
ReWriteRule ^(.*)$ example/$1 [L]

# END Domain to folder mapping

将请求映射到实际查询字符串的第二个 .htaccess 文件位于第一个重写步骤中映射到的子目录中:

SetEnv HTTP_MOD_REWRITE On
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ([^/]*)([/]*)([^/]*)([/]*)(.*) index.php?controller=$1&action=$3&args=$3 [L,QSA]

所有这一切的结果,在我安装我的 ssl 证书之前,是一个看起来像这样的请求:

example.com/hello/foo/123

将映射到:

http://www.example.com?controller=hello&action=foo&args=123

现在我只是被发送到索引文件。如果我输入实际的查询字符串,我会得到正确的结果。

我查看了我的服务器的重写日志,似乎有一个额外的重写步骤被执行,但我无法弄清楚原因。我认为这是重写日志中的相关内容:

[rewrite:trace3] [www.example.com/sid#8021c1788][rid#807418748/initial/redir#1] [perdir /fs6c/example/public/example/] strip per-dir prefix: /fs6c/example/public/example/hello -> hello
[rewrite:trace3] [www.example.com/sid#8021c1788][rid#807418748/initial/redir#1] [perdir /fs6c/example/public/example/] applying pattern '([^/]*)([/]*)([^/]*)([/]*)(.*)' to uri 'hello'
[rewrite:trace2] [www.example.com/sid#8021c1788][rid#807418748/initial/redir#1] [perdir /fs6c/example/public/example/] rewrite 'hello' -> 'index.php?controller=hello&action=&args='
[rewrite:trace3] [www.example.com/sid#8021c1788][rid#807418748/initial/redir#1] split uri=index.php?controller=hello&action=&args= -> uri=index.php, args=controller=hello&action=&args=

我假设 [L] 标志是罪魁祸首,但我不明白为什么在我切换到 ssl 之前这不是问题。

我使用的是共享托管服务,他们必须为我安装证书,因为他们不会向用户公开服务器的必要部分。

最佳答案

我仍然不知道为什么会这样,但我找到了一种方法让它与 ssl 证书一起工作。这些是位于根目录的 htaccess 文件中的相关重写规则:

# for existing files, redirect to subdirectory
ReWriteCond %{HTTP_HOST} ^(www\.)?example.com
ReWriteCond %{REQUEST_URI} !example/
RewriteCond %{DOCUMENT_ROOT}/example/$1 -f
ReWriteRule ^(.*) example/$1 [L]

# for non-existing files, map to index.php with CMS arguments
ReWriteCond %{HTTP_HOST} ^(www\.)?example.com

# file exists, but is index.php
ReWriteCond %{REQUEST_URI} index.php [OR]

# file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-f

ReWriteRule ^([^/]*)([/]*)([^/]*)([/]*)(.*) example/index.php?controller=$1&action=$3&args=$5 [L,QSA]

我删除了第二个 htaccess 文件。

我希望这对将来的人有所帮助。托管服务提供商是 NearlyFreeSpeech。如果有人知道为什么我的旧规则不起作用,我将不胜感激!

关于apache - 安装 ssl 证书后 CMS 的重写规则失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com