我正在尝试使用 .htaccess 将所有 URL 从 301 重定向http://
到https://
。应排除一些动态生成的 URL。
我做的一些 URL 示例不是想要重定向:
example.com/tt.php?xxx (where xxx can be any number)
example.com/top/xxx/site/xxx (where xxx can be any number or characters)
现在我的.htaccess 看起来像这样:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
我如何“排除”我的动态 URL?
答案1
现在我的
.htaccess
样子是这样的:
如果这就是你的.htaccess
文件中的全部内容,那么你可以包含一些例外对于要排除的 URL前现有的重定向规则。
例如:
# Prevent further processing if requesting a URL of the form
# example.com/tt.php?xxx (where xxx can be any number)
RewriteCond %{QUERY_STRING} ^\d+$
RewriteRule ^tt\.php$ - [L]
# Prevent further processing if requesting a URL of the form
# example.com/top/xxx/site/xxx (where xxx can be any number or characters)
RewriteRule ^top/[^/]+/site/ - [L]
通过放置上述“例外”第一的那么所有后续的指令(即重定向)都将被跳过。
更新:如果您的.htaccess
文件中还有其他指令仍然适用于这些 URL,那么您可以改为向现有的重定向规则添加其他条件。
例如:
RewriteCond %{THE_REQUEST} !^[A-Z]{3,6}\s/tt\.php\?\d+\sHTTP
RewriteCond %{REQUEST_URI} !^/top/[^/]+/site/
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
请注意,前两个条件!
在条件模式来否定其含义。因此,只有当正则表达式满足以下条件时,条件才会成功:不是匹配。
请注意,我没有像第一个示例中那样使用两个指令(RewriteCond
和RewriteRule
)来匹配 URL,而是/tt.php?xxx
将其组合成一条规则并进行匹配THE_REQUEST
- 这是为了简化此规则中的逻辑。
THE_REQUEST
服务器变量保存 HTTP 请求的第一行。