编写具有特定规则的 htaccess 文件

Write an htaccess file with specific rules

所以基本上我正在尝试编写以下规则:

假设我有这个网站:www.example.com

  1. HTTP -> 重定向到 -> HTTPS

  2. www -> 重定向到 -> 非 www

  3. 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 指令中规定的扩展名列表中。