【问题标题】:.htaccess RewriteRule gives right link but also a 404.htaccess RewriteRule 提供正确的链接,但也提供 404
【发布时间】:2021-01-25 16:34:55
【问题描述】:

我正在托管不同的网站

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 .htaccess redirect mod-rewrite url-rewriting


    【解决方案1】:

    无需硬编码主机名,您可以在站点根目录 .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]
    

    【讨论】:

    • 谢谢,我更新了底部的 OP 并提供了更多信息。
    • 问题不是规则而是src="../../_misc/bna.js"的使用。应该是src="_misc/bna.js"
    • 该死,如果没有应用 RewriteRule 会破坏网站:(
    • 您需要漂亮的 URL 还是旧的 URL,您必须做出决定。但是,如果您希望 src= 对这两种情况都有效,请使用绝对 URL,例如 src="/example.nl/_misc/bna.js"
    【解决方案2】:

    对于您显示的示例,您能否尝试以下操作。公平的警告我已经在移动设备上写了这个,所以还没有测试它应该可以工作恕我直言也会在某个时候测试它。另外,由于您提到可能有多个域,所以我在这里专门设置了一个条件来检查它是否是 example.nl,以防您想重写任何域的请求,那么我们也可以省略该条件。

    RewriteEngine ON
    RewriteCond %{HTTP_HOST} ^example\.nl$ [NC]
    RewriteRule ^([a-zA-Z]+)/?$ %{HTTP_HOST}/_sites/$1 [L]
    

    注意:如果您的目录/文件夹不一定以字母开头并且可以是任何东西,则将上面的正则表达式从 ^([a-zA-Z]+)/?$ 更改为 ^([.*])/?$

    【讨论】:

    • 嗨,谢谢帮助,到目前为止它什么也没做。
    • @clankill3r,能否请您告诉我您点击的是哪个网址以及您在日志或浏览器中看到的内容?以便我更好地理解它,谢谢。
    • 我点击了hslab.nl/hslab.nl/_sites/prolactin,它出现了,但链接没有改变。错误日志为空,其他日志如下所示:pastebin.pl/view/86b37762(最后 100 行,我在加载网站时发送过几次垃圾邮件)
    • 不,我认为您第一次就理解了。文件夹的 OP 现在有一张图片。
    • @clankill3r,好的。您可能需要使用 base 标签来修复您的 js 和其他相关资源。如果您使用相对路径链接 js 文件,那么该文件显然会得到 404,因为它正在寻找 URL 路径。例如,如果 URL 路径是 /file/ 而不是 file.html,那么您的相关资源将从 /file/ 加载,这不是目录而是重写的 html 文件。要解决此问题,请使您的链接成为绝对链接或使用基本标签。在您的网页标题中添加此<base href="/">,以便您的相关链接可以从正确的位置加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2020-11-19
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多