.htaccess - 为什么子域到文件夹上出现错误 500
问题描述
这是文件里面的.htaccess
内容:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ Subdomains/%1/$1 [L,NC,QSA]
当我在域中时(例如x.example.com
:),它显示错误 500。我做错了什么?
例子:
x.example.com -> show example.com/Subdomains/x but keep the URL of x.example.com
y.example.com -> show example.com/Subdomains/y but keep the URL of y.example.com
z.example.com -> show example.com/Subdomains/z but keep the URL of z.example.com
解决方案
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule ^(.*)$ Subdomains/%1/$1 [L,NC,QSA]
如果没有任何其他指令来阻止它,上述将导致内部重写循环,这将导致对浏览器的 500 Internal Server Error 响应。
例如,如果您请求https://sub.example.com/foo
那么...
- 请求被重写为
/Subdomains/sub/foo
. - 在目录上下文中(即。
htaccess
)重写过程重新开始,将/Subdomains/sub/foo
输入传递给下一轮处理...... - 请求被重写为
/Subdomains/sub/Subdomains/sub/foo
. - 重写过程重新开始......
- 请求被重写为
/Subdomains/sub/Subdomains/sub/Subdomains/sub/foo
. - 重写过程重新开始......
- 等等,直到服务器放弃。(默认为 10 次内部重写后。)
该L
标志不会停止目录上下文中的所有处理(即。htaccess
)。它只是停止当前轮的处理。重写过程继续进行,直到 URL 不变地通过。
Apache 2.4 的快速修复方法是简单地将L
标志替换为END
. 这会导致所有处理停止。不会发生进一步的通过重写引擎。
例如:
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule (.*) Subdomains/%1/$1 [END]
NC
和QSA
标志在这里是多余的。
请注意,正则表达式^(.*)\.example\.com
匹配任意数量的子子域,包括www
它自己,如果这是一个问题?
如果不使用该END
标志(Apache 2.4),那么您需要明确检查您是否尚未重写 URL。/Subdomains/....
一种方法是在已经请求的情况下防止任何进一步的重写:
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule ^((?!Subdomains/).*)$ Subdomains/%1/$1 [L]
请注意,如果您.htaccess
在/Subdomains/<sub>
子目录中还有另一个文件也使用 mod_rewrite,那么这也将阻止重写循环,因为默认情况下不继承 mod_rewrite 指令。
更新:有没有办法检查文件夹是否存在然后重定向到 domain.com?
是的,您可以这样做,例如:
# If subdomain does not map to a subdirectory then redirect to root of main domain
RewriteCond %{HTTP_HOST} ^(.*)\.(example\.com)
RewriteCond %{DOCUMENT_ROOT}/Subdomains/%1 !-d
RewriteRule ^ https://%2/ [R=302,L]
# Otherwise, internally rewrite the request to subdirectory (if not already)
RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule ^((?!Subdomains/).*)$ Subdomains/%1/$1 [L]
但是,这可以说对您的用户有害。自定义 404 响应可能更可取。
推荐阅读
- javascript - 带有电子邮件链接的 Firebase 登录会删除 ActionCodeSettings URL 中的路径
- javascript - 如何使用 google drive api 将文件上传到 google drive?
- oauth-2.0 - Microsoft Power Automate 令牌不刷新
- c# - Identity Server 4 - MVC 客户端的 OpenIdConnect 处理程序中缺少角色声明
- python - 字符串重新定位
- heroku - Heroku:如何在部署期间在 Heroku 中的 python 应用程序上运行 npm build?
- numpy - Numpy 和删除具有相同值的行的最佳方法
- javascript - 如何在 Visial Studio Code 扩展开发中为命令“explorer.newFile”提供参数
- c++ - 如何将txt文件中的数据打印到二维矩阵?(不使用向量)
- reactjs - React:与磁盘/情感上的对应名称不匹配