.htaccess将内容重写到子文件夹

时间:2018-12-21 16:01:05

标签: .htaccess mod-rewrite

我的Web服务器上具有以下文件夹结构:

Folder structure

我需要一些重写规则:

  1. 当我访问http://testdomain1.com/时,我需要将/pages/testdomain1.com/设置为根目录,以显示该目录中的内容。

    类似地,http://testdomain2.com/的根文件夹是/pages/testdomain2.com/等。

  2. 当请求的URL具有la var时-我需要重写到登录目录。

    示例: http://testdomain1.com/?la=template1-将/lands/template1/设置为根目录

我当前的.htaccess(对于第一个任务)有一些问题:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$
RewriteRule ^(/)?$ pages/%{HTTP_HOST}/index.html [L]

重写规则有效,但是所有资产数据(js,css)均无效(找不到404)。 如何设置正确的规则?

1 个答案:

答案 0 :(得分:1)

  

...但是所有资产数据(js,css)均无效(找不到404)。如何设置正确的规则?

这很可能是由于使用资产的相对URL路径引起的。您需要“修复” URL路径是相对于根目录还是绝对路径。这不是应该在.htaccess中修复的问题,否则可以重写。

请参阅网站管理员堆栈上以下问题的my answer,该问题与在使用URL重写时使用相对于静态资产的相对URL路径有关:

RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$
RewriteRule ^(/)?$ pages/%{HTTP_HOST}/index.html [L]

这仅重写对根的请求,即。 testdomain1.com/。而不是testdomain1.com/foo-是故意的吗?

  

我不仅需要example.com/page.html才能访问任何页面(index.html)。

如果您是说将http://testdomain1.com/foo格式的请求改写为/pages/testdomain1.com/foo,那么您需要将以上内容更改为以下内容:

RewriteCond %{QUERY_STRING} !^la=[\w-]+
RewriteCond %{HTTP_HOST} ^(?:www.)?(testdomain1\.com)$
RewriteRule !^pages/ pages/%1%{REQUEST_URI} [L]

请注意,这会重写所有内容,包括CSS,JS和图像。

第一个条件(RewriteCond伪指令)不包含包含la URL参数的URL。 (这些网址在下面处理。)

这还修复了您现有指令中的错误,该错误导致对www子域(例如www.testdomain1.com)的请求将导致错误的重写。 substitution 字符串中的%1后向引用包含所请求的域-减去可选的www子域。 (我假设您没有子目录www.testdomain1.com?)尽管可以争辩地说,您应该早已在配置文件中对www / non-www进行了规范化。

(请记住,不要转义文字点。)

更新:

  

我尝试将这种情况用于多个域,而不仅是testdomain1.com。因此,我需要更改RewriteCond %{HTTP_HOST} ^(www.)?testdomain1.com$部分。我刚刚尝试过RewriteCond %{REQUEST_URI},但是没有用。

对于多个域,您可以:

  • 为每个域复制上述代码块,并在第二种情况下更改testdomain1.com域。

  • 如果这仅适用于3个域,则可以在第二种情况下使用 alternation 来匹配3个域中的任何一个。例如:

    RewriteCond %{HTTP_HOST} ^(?:www.)?(testdomain1\.com|testdomain2\.com|testdomain3\.com)$
    
  • 如果这适用于任何域,则使正则表达式更通用以匹配任何域。例如:

    RewriteCond %{HTTP_HOST} ^(?:www.)?([a-z0-9.-]+?)\.?$
    
  

2)当请求URL具有“ la”变量时-我需要重写到登陆目录。
  示例:http://testdomain1.com/?la=template1-将/lands/template1/设置为根目录

正如我的评论中所述,您可能不应该将其重写为目录。处理请求的不是目录,而是文件。通过重写目录,我假设您依靠mod_dir发出目录索引文档的内部子请求(由DirectoryIndex指令指定)。为了这个示例,我将假定目录索引为index.php

这需要在上述重写之前 ,因为它更具体:

RewriteCond %{QUERY_STRING} ^la=([\w-]+)
RewriteRule ^$ /lands/%1/index.php [L]

%1(与$1相反)是对最后匹配的 CondPattern 中捕获的模式的反向引用。正则表达式[\w-]+la参数值限制为字符0-9a-zA-Z_-la参数还必须是第一个URL参数。

相关问题