将 www 重定向到非 www,并重定向到 index.php

将 www 重定向到非 www,并重定向到 index.php

我的万维网文件夹有以下 .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

相关内容