我的万维网文件夹有以下 .htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
我的api文件夹(在万维网文件夹)具有以下 .htaccess
RewriteEngine On
RewriteBase /api/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /api/index.php [L]
我想将 www 重定向到非 www 网址,同时保留 index.php 的规则。我尝试了很多方法,但都没有成功...
我尝试过:
https://stackoverflow.com/questions/234723/generic-htaccess-redirect-www-to-non-www
更新 :
我想我可能只需要一系列的规则
那是 :
1/ 将 www 重定向到非 www 的 URL 并转到 2
2/如果文件不存在 -> 重定向至 index.php
RewriteEngine On
RewriteBase
%% Here redirect www to non www url %%
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
答案1
从评论中可以看出,似乎不需要维护两个单独的文件。在这种情况下,在文档根目录中.htaccess
只维护一个文件会更简单(假设它们是相关的)。.htaccess
我还对您的“api”做出了以下假设,这也简化了指令:
- 所有此类请求
/api/<anything>
都应发送至/api/index.php
- 没有需要通过 访问的物理文件(或目录)
/api/<file>
。(毕竟它是一个“API”。)
然后您可以在根文件中执行以下操作.htaccess
(并/api/.htaccess
完全删除该文件)。
RewriteEngine On
# Canonical redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
# Prevent further processing if the front-controller(s) has already been requested
RewriteRule ^(api/)?index\.php$ - [L]
# Rewrite requests for the API
RewriteRule ^api/. api/index.php [L]
# Rewrite requests for the root application
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
RewriteBase
这里不需要该指令。
请注意,您应该先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。并且您可能需要在测试之前清除浏览器(以及任何中间)缓存。
但是,对此的一点担忧(正如我在评论中提到的)是,为你的请求实现规范重定向/api/
。向 API 发出请求的脚本通常不会遵循重定向 - 预计这些请求已经发送到规范 URL。因此,为这些请求实现重定向可能会休息这些“不正确”的 API 调用指向非规范主机名。如果 API 调用指向非规范主机名,这有关系吗?从 www 到非 www 的重定向通常仅用于 SEO,不适用于 API。
维护两个.htaccess
文件(替代)
或者,如果您维护两个单独的.htaccess
文件(也许它们是两个不相关的项目)。一个在根目录中,另一个在/api
子目录中,那么您需要在两个.htaccess
文件中重复 www 到非 www(规范)的重定向,因为默认情况下 mod_rewrite 指令不会被继承。
例如:
# /.htaccess (root) file
RewriteEngine On
# Canonical redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
# Prevent further processing if the front-controller has already been requested
RewriteRule ^index\.php$ - [L]
# Rewrite requests for the root application
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
和
# /api/.htaccess file
RewriteEngine On
# Canonical redirect www to non-www
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]
# Prevent further processing if the front-controller has already been requested
RewriteRule ^index\.php$ - [L]
# Rewrite everything to the API
RewriteRule . index.php [L]
与原始子目录不同,/api/.htaccess
不需要api
明确说明,因为我们使用的是相对的URL 路径(不需要指令RewriteBase
)。相对 URL 路径是相对于包含文件的目录的- 因此在本例中.htaccess
是相对于指令的。/api