我不能在 htaccess 中同时应用两条规则
I can't apply two rules at the same time in htaccess
感谢阅读我的文章。
我的目标是在本地和生产中拥有相同的 htaccess 代码。
首先,我需要将 example.com/index.php?action=somepage 重写为 example.com/somepage。
其次,我必须重写 http://example.com to https://example.com,但仅限于生产环境,而不是本地主机。
到目前为止,这是我的代码:
RewriteEngine on
RewriteBase /
# For Ionos
RewriteRule ^([0-9a-zA-Z/\ -]+)(?:&([0-9a-zA-Z&=_\ -]+))?$ index.php?action=&
# : route name and framework parameters
# : classic $_GET parameters (¶m=value)
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]
当我使用 https:// 连接时,没问题,适用关于索引和操作的第一条规则。
当我使用 http:// 时,地址变为 https://,但 index/action 规则不适用。
非常感谢!
编辑:有效:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301]
# For Ionos, http => https
RewriteRule ^([0-9a-zA-Z/\ -]+)(?:&([0-9a-zA-Z&=_\ -]+))?$ index.php?action=&
# : route name and framework parameters
# : classic $_GET parameters (¶m=value)
但我还有最后一个问题。
我的文件夹是这样的:
[] example
...[]public
......htaccess
...htaccess
上面显示的代码是public目录下的htaccess。示例目录的 htaccess 重定向到 public:
RewriteEngine on
RewriteBase /
# for Ionos
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/ [L]
问题是 http://example.com redirect to https://example.com, http://example.com/somepage redirect to https://example.com/public/somepage,我无法删除“public”部分。
谢谢!
您的两条规则“之前”的顺序有误。您的外部重定向(HTTP 到 HTTPS)需要在内部重写之前。你的第一条规则(重写)仍然适用,但它会导致外部重定向到 index.php?action=...
(暴露你的 internal file/URL 结构)。
但是,您还缺少这两个规则中的 L
标志。
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301]
如果它在 /public/.htaccess
文件中并且 /public
子目录被隐藏(即它正在被内部重写),那么您需要将 RewriteRule
更改为:
RewriteRule (.*) https://%{HTTP_HOST}/ [R=301,L]
在父配置内部重写请求后,REQUEST_URI
服务器变量包含完整的 URL-path,包括“隐藏”/public
子目录,因此如果您重定向到REQUEST_URI
它将暴露隐藏的子目录。然而,如果您使用对匹配的 RewriteRule
模式 的反向引用,它与相对于当前目录的 URL-path 相匹配,那么这自然会排除 /public
子目录。
感谢阅读我的文章。 我的目标是在本地和生产中拥有相同的 htaccess 代码。 首先,我需要将 example.com/index.php?action=somepage 重写为 example.com/somepage。 其次,我必须重写 http://example.com to https://example.com,但仅限于生产环境,而不是本地主机。 到目前为止,这是我的代码:
RewriteEngine on
RewriteBase /
# For Ionos
RewriteRule ^([0-9a-zA-Z/\ -]+)(?:&([0-9a-zA-Z&=_\ -]+))?$ index.php?action=&
# : route name and framework parameters
# : classic $_GET parameters (¶m=value)
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]
当我使用 https:// 连接时,没问题,适用关于索引和操作的第一条规则。 当我使用 http:// 时,地址变为 https://,但 index/action 规则不适用。
非常感谢!
编辑:有效:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301]
# For Ionos, http => https
RewriteRule ^([0-9a-zA-Z/\ -]+)(?:&([0-9a-zA-Z&=_\ -]+))?$ index.php?action=&
# : route name and framework parameters
# : classic $_GET parameters (¶m=value)
但我还有最后一个问题。 我的文件夹是这样的:
[] example
...[]public
......htaccess
...htaccess
上面显示的代码是public目录下的htaccess。示例目录的 htaccess 重定向到 public:
RewriteEngine on
RewriteBase /
# for Ionos
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/ [L]
问题是 http://example.com redirect to https://example.com, http://example.com/somepage redirect to https://example.com/public/somepage,我无法删除“public”部分。
谢谢!
您的两条规则“之前”的顺序有误。您的外部重定向(HTTP 到 HTTPS)需要在内部重写之前。你的第一条规则(重写)仍然适用,但它会导致外部重定向到 index.php?action=...
(暴露你的 internal file/URL 结构)。
但是,您还缺少这两个规则中的 L
标志。
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=301]
如果它在 /public/.htaccess
文件中并且 /public
子目录被隐藏(即它正在被内部重写),那么您需要将 RewriteRule
更改为:
RewriteRule (.*) https://%{HTTP_HOST}/ [R=301,L]
在父配置内部重写请求后,REQUEST_URI
服务器变量包含完整的 URL-path,包括“隐藏”/public
子目录,因此如果您重定向到REQUEST_URI
它将暴露隐藏的子目录。然而,如果您使用对匹配的 RewriteRule
模式 的反向引用,它与相对于当前目录的 URL-path 相匹配,那么这自然会排除 /public
子目录。