【问题标题】:Load website in a subdirectory using .htaccess使用 .htaccess 在子目录中加载网站
【发布时间】:2021-10-27 21:57:19
【问题描述】:

我需要在子目录中对实际网站进行完整的备份,但我不明白为什么它不起作用,我的意思是网站显示不正确。

这里是根目录的.htaccess 代码。我需要在子目录“/old/”中进行备份。


RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .? http://www.%example.com%{REQUEST_URI} [R=301,L]

RewriteRule ^([^/]*)/css/(.*) /css/$2 [L]
RewriteRule ^([^/]*)/js/(.*) /js/$2 [L]
RewriteRule ^([^/]*)/fonts/(.*) /fonts/$2 [L]
RewriteRule ^([^/]*)/images/(.*) /images/$2 [L]
RewriteRule ^([^/]*)/templates/(.*) /templates/$2 [L]


RewriteRule ^([^/]*)/$ /index.php?lang=$1 [L]
RewriteRule ^([^/]*)/([^/]*)$ /index.php?lang=$1 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?lang=$1 [L]
RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?lang=$1 [L]

感谢您的帮助!

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:
    RewriteRule ^([^/]*)/css/(.*) /css/$2 [L]
    RewriteRule ^([^/]*)/js/(.*) /js/$2 [L]
    RewriteRule ^([^/]*)/fonts/(.*) /fonts/$2 [L]
    RewriteRule ^([^/]*)/images/(.*) /images/$2 [L]
    RewriteRule ^([^/]*)/templates/(.*) /templates/$2 [L]
    
    RewriteRule ^([^/]*)/$ /index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)$ /index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?lang=$1 [L]
    

    您只需从上述指令中的所有 substitution 字符串中删除斜线前缀。然后,您可以在根目录和备份子目录中使用相同的 .htaccess 文件。

    例如:

    RewriteRule ^([^/]*)/css/(.*) css/$2 [L]
    RewriteRule ^([^/]*)/js/(.*) js/$2 [L]
    RewriteRule ^([^/]*)/fonts/(.*) fonts/$2 [L]
    RewriteRule ^([^/]*)/images/(.*) images/$2 [L]
    RewriteRule ^([^/]*)/templates/(.*) templates/$2 [L]
    
    RewriteRule ^([^/]*)/$ index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)$ index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ index.php?lang=$1 [L]
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)/([^/]*)$ index.php?lang=$1 [L]
    

    删除斜线前缀使替换相对于包含.htaccess 文件的目录。

    如果您愿意,可以将这 9 个指令减少/简化为 2 个:

    RewriteRule ^[^/]+/((?:css|js|fonts|images|templates)/.*) $1 [L]
    RewriteRule ^([^/]+)(?:/[^/]*){1,3}$ index.php?lang=$1 [L]
    

    更新:我已经修复了第二条“简化”规则中的正则表达式,因为当只有一个路径段时,尾部斜杠是强制性的(以前如果尾部斜杠是包括)。对于两个和三个路径段,尾部斜杠实际上是可选,对于四个路径段,不应有尾部斜杠。尽管这是否真的是原始指令的意图是另一回事。第二个“简化”规则现在匹配该行为。 (以前,它不允许带有任意数量路径段的尾部斜杠。)


    旁白:

    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]
    
    RewriteCond %{HTTP_HOST} ^([a-z.]+)?example\.com$ [NC]
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule .? http://www.%example.com%{REQUEST_URI} [R=301,L]
    

    您应该颠倒这两条规则的顺序。否则,第一条规则将阻止规范重定向(以 www 子域为前缀)在直接文件请求中发生。

    【讨论】:

    • @RavinderSingh13 谢谢,虽然我在第二条“简化”规则的正则表达式中发现了一个错误。当只有一个路径段时,原始规则需要一个尾部斜杠(尽管当有 2 个以上的路径段时不强制执行,当有 4 个路径段时完全省略!)。如果存在斜杠,我最初的简化规则将不匹配。我已经更新了我的答案并修复了这个正则表达式,因此它的行为与原始指令相同。
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多