apache - .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
的屏幕截图:
解决方案
如果没有硬编码主机名,您可以在站点根目录 .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]
推荐阅读
- docker - 如何使用自签名证书运行 docker 容器
- wordpress - 如果找不到文件,则 Htaccess 重写
- c - For Loop 在 MPLAB IDE for PIC 微控制器程序中无法正常工作
- android - fcm 推送通知不适用于一加 6 手机
- mongodb - 如果安全,则无法连接到 mongodb
- c++ - C++中如何用getter方法实现封装
- node.js - Node.js - 如何同时导出对象和函数
- ms-access - 重复记录明细并记录在报告的同一页面中
- javascript - 无法获取 /about vue js vue.js
- javascript - 使用 ESLint `indent` 规则忽略模板文字中的缩进