.htaccess 如何重定向一个以html结尾的url到https非www版本,同时又从特定的php文件中检索内容?

ltqd579y  于 2023-01-02  发布在  PHP
关注(0)|答案(1)|浏览(85)

我仍然是新的htaccess。我有一个静态网站,有几个目录内的内容。我用这个重定向301所有html页面到其https非www版本。

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) https://example.com/$1 [L,R=301]

我希望网站是动态的。所以当它重定向到https non-www版本后,我希望它能从一个特定的php文件中抓取资源。但是,我不知道如何做到这一点,同时也做了第一个301重定向。
我试图通过使用以下内容来获取资源:

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) https://example.com/$1
RewriteRule (.*)/(.*)/(.*)\.html$ https://note.mathpro.id/$2.php?name=$3 [L,R=302]

此URL http://example.com/category/uncategorized.htmlhttps://example.com/category.php?name=uncategorized检索内容,但不像最初那样将其重定向到https://example.com/category/uncategorized.html
有人能帮忙吗?

ui7jx7zq

ui7jx7zq1#

...我不知道如何做到这一点,同时也做第一个301重定向.
这是两个完全独立的任务,需要两个不同的规则。您不应该修改第一个(规范重定向)规则。(由于某些原因,您删除了flags参数,即[L,R=301]-重定向需要L标志才能按预期运行。)

RewriteRule (.*)/(.*)/(.*)\.html$ https://note.mathpro.id/$2.php?name=$3 [L,R=302]

这不应该是一个外部重定向,它应该是一个 * 内部重写 *。换句话说,你希望(可见的)URL保持为/category/uncategorized.html。你不希望最终用户看到/category.php?name=uncategorized
由于某种原因,在RewriteRule * pattern * (.*)/(.*)/(.*)\.html$中也有三个捕获子模式,而示例URL /category/uncategorized.html只有两个?
你的正则表达式也应该有更多的限制。非常通用的.*的"问题"在于它是"贪婪的",消耗所有的东西,包括斜线。所以这个正则表达式也将匹配/foo/bar/baz/zip/bah/yop.html。(但是它将准确地匹配/捕获哪些部分?)
请尝试以下操作:

# 1. Canonical redirect (UNCHANGED)
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule (.*) https://example.com/$1 [L,R=301]

# 2. Rewrite to handler
RewriteRule ^([^/]+)/([^/]+)\.html$ $1.php?name=$2 [L]

这假定.htaccess文件位于文档根目录中。
然而,上述重写的一个小问题是,不管"handler"(例如category.php)是否存在,它都会重写URL。这不一定是什么大问题,但它意味着404是在category.php(重写的文件路径)上触发的,而不是/category/uncategorized.html(用户最初请求的URL)上。
要解决此问题,可以先检查目标文件是否存在。例如:

# 2. Rewrite to handler if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/]+)/([^/]+)\.html$ $1.php?name=$2 [L]

相关问题