编写具有特定规则的 htaccess 文件
Write an htaccess file with specific rules
所以基本上我正在尝试编写以下规则:
假设我有这个网站:www.example.com
HTTP -> 重定向到 -> HTTPS
www -> 重定向到 -> 非 www
https://example.com/xyz
-> 重写为 -> https//example.com/post.php?id=xyz
所有这些规则应该同时起作用。我尝试了以下示例:
RewriteRule ^(.*)$RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteRule ^(.*)$ post.php?id= [L]
非常感谢您的帮助。
RewriteRule ^(.*)$RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteRule ^(.*)$ post.php?id= [L]
你的第一行看起来像错字(?),因为它没有意义。
您的第二条规则(重写)非常正确,可以将请求重写为 post.php?id=<url>
。然而,严格来说,考虑到第二个条件实际上只是为了提高效率,所以这两个条件的顺序是错误的。文件系统检查相对 昂贵 ,因此您应该在诉诸文件系统检查之前 排除对静态资源的请求(使用正则表达式字符串比较)。
所以,在这个重写之前你只需要添加一个HTTP到HTTPS 和 www到non-www重定向,这可以作为一个或两个规则实施。
请尝试以下操作:
RewriteEngine On
# HTTP to HTTPS and www to non-www generic redirect
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# Rewrite requests to "post.php"
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) post.php?id= [L]
注意:首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。
第一条规则中的 %1
是对最后匹配的 CondPattern 的反向引用。 IE。这包含域名,减去 www.
子域(如果有)。
关于从 HTTP 到 HTTPS 的重定向,这确实假设 SSL 证书直接安装在您的应用程序服务器上,并且您没有使用管理 SSL 证书的 front-end 代理。
如果您不希望 URL 包含 .php
扩展名,那么您还应该考虑将其添加到 RewriteCond
指令中规定的扩展名列表中。
所以基本上我正在尝试编写以下规则:
假设我有这个网站:www.example.com
HTTP -> 重定向到 -> HTTPS
www -> 重定向到 -> 非 www
https://example.com/xyz
-> 重写为 ->https//example.com/post.php?id=xyz
所有这些规则应该同时起作用。我尝试了以下示例:
RewriteRule ^(.*)$RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteRule ^(.*)$ post.php?id= [L]
非常感谢您的帮助。
RewriteRule ^(.*)$RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC] RewriteRule ^(.*)$ post.php?id= [L]
你的第一行看起来像错字(?),因为它没有意义。
您的第二条规则(重写)非常正确,可以将请求重写为 post.php?id=<url>
。然而,严格来说,考虑到第二个条件实际上只是为了提高效率,所以这两个条件的顺序是错误的。文件系统检查相对 昂贵 ,因此您应该在诉诸文件系统检查之前 排除对静态资源的请求(使用正则表达式字符串比较)。
所以,在这个重写之前你只需要添加一个HTTP到HTTPS 和 www到non-www重定向,这可以作为一个或两个规则实施。
请尝试以下操作:
RewriteEngine On
# HTTP to HTTPS and www to non-www generic redirect
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
# Rewrite requests to "post.php"
RewriteCond %{REQUEST_URI} !\.(?:css|js|jpe?g|gif|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) post.php?id= [L]
注意:首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。
第一条规则中的%1
是对最后匹配的 CondPattern 的反向引用。 IE。这包含域名,减去 www.
子域(如果有)。
关于从 HTTP 到 HTTPS 的重定向,这确实假设 SSL 证书直接安装在您的应用程序服务器上,并且您没有使用管理 SSL 证书的 front-end 代理。
如果您不希望 URL 包含 .php
扩展名,那么您还应该考虑将其添加到 RewriteCond
指令中规定的扩展名列表中。