我的Web服务器上具有以下文件夹结构:
我需要一些重写规则:
当我访问http://testdomain1.com/
时,我需要将/pages/testdomain1.com/
设置为根目录,以显示该目录中的内容。
类似地,http://testdomain2.com/
的根文件夹是/pages/testdomain2.com/
等。
当请求的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)。 如何设置正确的规则?
答案 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-9
,a-z
,A-Z
,_
和-
。 la
参数还必须是第一个URL参数。