繁体   English   中英

如何根据请求的子目录进行不同的 htaccess 重定向?

[英]How to have Different htaccess redirect based on subdirectory requested?

我试着四处寻找一个解决这个问题的问题,但我不知道确切的措辞,所以我找不到任何有用的东西。

我在我的网站上安装了 Wordpress,按照指南,我能够将它移动到不同的文件夹,所以我现在在我的主 public_html 目录中有 2 个文件夹。

我正在尝试将一些 p5.js 草图上传到第二个文件夹,以便我可以从 Wordpress 站点引用它们。 当我尝试将它们链接到本指南建议的 iframe 中时,问题就出现了。 我引用src="website.com/projects/project_name/sketch.html"但不幸的是它被重定向回 wordpress 安装 404 页面。

经过一些搜索,看起来我的主要 .htaccess 文件是问题所在。 我的文件看起来像这样(示例/my_subdir 已更改)

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_subdir/index.php [L] 
</IfModule>

所以我的问题是,我将如何修改它以保持从“website.com”重定向到 my_subdir/index.php(这是 Wordpress 安装),但添加一个警告,不要重定向 website.com/directory2 请求(这是项目将被存储)

如果您的代码example.com的 HOST 是您在问题中称为website.com ,并且我假设您的代码已经正常工作,除了directory2请求。 然后试试这个:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_subdir/
RewriteCond %{REQUEST_URI} !^/directory2/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_subdir/index.php [L] 
</IfModule>

已编辑目录 2 只需要更改 1 行

下面是我的测试:

IP:172.18.0.2

根目录:/www/htdocs

目录树(html文件内容):

-- htdocs/
 | -- my_subdir/
 |  | -- index.html (subdir index.html)
 |  | -- a1.html    (subdir a1.html)
 | 
 | -- directory2/
 |  | -- index.html (dir2 index.html)
 |  | -- b1.html    (dir2 b1.html)
 |
 | -- index.html    (helloworld index.html)
 | -- .htaccess

下面是我的.htaccess文件:

 RewriteEngine on
 RewriteBase /
 
 RewriteCond %{HTTP_HOST}        ^(172.18.0.2)$
 RewriteCond %{REQUEST_URI}      !^(/my_subdir/)       [NC]
 RewriteCond %{REQUEST_URI}      !^(/directory2/)      [NC]
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^(.*)$              /my_subdir/$1

 RewriteCond %{HTTP_HOST}        ^(172.18.0.2)$
 RewriteRule ^(/)?$              my_subdir/index.html  [L]

我的测试:

  1. 访问主机
 [user@client tmp]$ wget 172.18.0.2
 Saving to: ‘index.html’
 [user@client tmp]$ cat index.html
 subdir index.html

请求已到达 my_subdir/index.html

  1. 访问 172.18.0.2/my_subdir/a1.html
 [user@client tmp]$ wget 172.18.0.2/my_subdir/a1.html
 Saving to: ‘a1.html’
 [user@client tmp]$ cat a1.html
 subdir a1.html

请求已到达 my_subdir/a1.html

  1. 访问 172.18.0.2/a1.html
 [user@client tmp]$ wget 172.18.0.2/a1.html
 Saving to: ‘a1.html’
 [user@client tmp]$ cat a1.html
 subdir a1.html
 

请求已到达 my_subdir/a1.html

  1. 访问 172.18.0.2/directory2
 [user@client tmp]$ wget 172.18.0.2/directory2
 ...
 HTTP request sent, awaiting response... 301 Moved Permanently
 Location: http://172.18.0.2/directory2/ [following]
 ...
 Saving to: ‘directory2’
 [user@client tmp]$ cat directory2
 dir2 index.html

请求已到达 directory2/index.html

  1. 访问 172.18.0.2/directory2/b1.html
 [user@client tmp]$ wget 172.18.0.2/directory2/b1.html
 Saving to: ‘b1.html’
 [user@client tmp]$ cat b1.html
 dir2 b1.html

请求已到达 directory2/b1.html

  1. 访问 172.18.0.2/testerror
 [user@client tmp]$ wget 172.18.0.2/testerror
 ERROR 404: Not Found.
 [user@server log]$ tail error_log
 AH00128: File does not exist: /www/htdocs/my_subdir/testerror

请求试图到达 my_subdir/testerror 并且什么也没找到

所以基于这个小测试:

  1. 对我的 IP 主机的任何请求都已检查.htaccess重写规则
  2. 仅请求主机将被重写到 my_subdir/index.html(测试 1)
  3. 不以my_subdirdirectory2开头的请求子 url 将全部重写为my_subdir并带有任何后续字符串(测试 3 和 6)
  4. 使用详细文件名向my_subdir请求将访问my_subdir/下的文件(测试 2)
  5. directory2请求不会被重定向到my_subdirmy_subdir会访问directory2下的索引或文件(测试 4 和 5)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM