首页 > 解决方案 > .htaccess RewriteRule 提供正确的链接,但也提供 404

问题描述

我托管不同的网站

http://example.nl/example.nl/_sites/byos/
http://example.nl/example.nl/_sites/eggbot/
http://example.nl/example.nl/_sites/hslab/
http://example.nl/example.nl/_sites/prolactin/

是的,有一个与域同名的文件夹,这是有原因的。

我希望链接变成:

http://example.nl/byos/
http://example.nl/eggbot/
http://example.nl/hslab/
http://example.nl/prolactin/

这是众多尝试之一:

RewriteEngine On 
Options +FollowSymlinks 
RewriteCond %{REQUEST_URI} !(.*)example.nl/_sites
RewriteRule ^(.*)$ example.nl/_sites/$1 [L]

和这个:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
RewriteRule ^example.nl/_sites/(.*)$ /$1 [L,NC,R]

最后一个让我接近,它改变了我想要的地址,但它现在也导致了 404。我还尝试重命名 example.nl 文件夹,使其与域名不同,但问题似乎相同。

以防以后很重要,我在这里也有包含文件的文件夹:

http://example.nl/example.nl/_misc/
http://example.nl/example.nl/_plugins/

但我不在乎这些是否被重命名,因为它们不会出现在 url 栏中,除非用户直接转到其中一个文件,但我不在乎。

那么我怎样才能省略这example.nl/_sites/部分而仍然让网站正常工作呢?

我在 SO 上看到过类似的问题,但对我来说,它看起来像是另一种方言的中文。

----编辑:使用anubhava的以下答案:

RewriteCond %{HTTP_HOST}::%{THE_REQUEST} ^(?:www\.)?([^:]+)::GET\s/+\1/_sites/(\S*)\s [NC]
RewriteRule ^ /%2 [R=301,NE,L]

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^[^/]+/?$ %1/_sites%{REQUEST_URI} [L]

我不再收到404了。但是这个文件例如:

http://hslab.nl/hslab.nl/_misc/bna.js

它尝试将其加载为:

http://hslab.nl/_misc/bna.js

哪个失败了。在代码中,它的目标是:

src="../../_misc/bna.js"

如果它有帮助,这里是文件夹 hslab.nl的屏幕截图:

在此处输入图像描述

标签: apache.htaccessredirectmod-rewriteurl-rewriting

解决方案


如果没有硬编码主机名,您可以在站点根目录 .htaccess 中尝试这些规则:

RewriteCond %{HTTP_HOST}::%{THE_REQUEST} ^(?:www\.)?([^:]+)::GET\s/+\1/_sites/(\S*)\s [NC]
RewriteRule ^ /%2 [R=301,NE,L]

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^[^/]+/?$ %1/_sites%{REQUEST_URI} [L]

推荐阅读