htaccess 重定向会在 url 中添加问号

htaccess 重定向会在 url 中添加问号

我的 htaccess 中有以下内容:

#When your application folder isn't in the system folder
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /?/$1 [L]

#Checks to see if the user is attempting to access a valid file,
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ?/$1 [L]

#No WWW
RewriteCond %{HTTP_HOST} !^myrealdomain.com$ [NC]
RewriteRule ^(.*)$ https://myrealdomain.com/$1 [L,R=301]

#Always redirect to SSL pages
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

我希望www被重定向,并且我希望所有页面都是https。它似乎可以工作,但是当我尝试转到 时,https://www.d.com/hello它会重定向到https://d.com/?/hello

那个多余的问号是从哪里来的?

此外,创建一个Facebook 点赞按钮似乎根本不喜欢我的域名。按钮显示为空白,我认为这与上面的内容有关……?

任何帮助都非常感谢。

答案1

这通常是 mod_rewrite 中不太容易理解的部分。所有规则(除非规则后面跟着[L])都按顺序处理,并且规则更改 URI 的值. 它们不会改变 的值%{THE_REQUEST}

因此你的第二条规则是:

RewriteRule ^(.*)$ ?/$1 [L]

导致 的请求/hello被重写为?/hello。下一个规则的输入现在是?/hello

下一条规则:

RewriteRule ^(.*)$ https://myrealdomain.com/$1 [L,R=301]

用于$1匹配整个 URI,并将 301 重定向发送到新域上的该 URI。这就是问号的由来。这是内部重写,然后在同一请求中进行重定向。

您可以通过将^application重写和有效文件重写移至底部(所有重定向规则之后)来解决此问题。

您的 https 重定向缺失[L,R=301]

我不知道 Facebook 的“点赞”按钮,但在解决问号问题后,如果它仍然不起作用,请尝试再次询问或阅读 Facebook 文档。

相关内容