首页 > 解决方案 > 为什么子域到文件夹上出现错误 500

问题描述

这是文件里面的.htaccess内容:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ Subdomains/%1/$1 [L,NC,QSA]

当我在域中时(例如x.example.com:),它显示错误 500。我做错了什么?

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

标签: .htaccessmod-rewrite

解决方案


RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule ^(.*)$ Subdomains/%1/$1 [L,NC,QSA]

如果没有任何其他指令来阻止它,上述将导致内部重写循环,这将导致对浏览器的 500 Internal Server Error 响应。

例如,如果您请求https://sub.example.com/foo那么...

  1. 请求被重写为/Subdomains/sub/foo.
  2. 目录上下文中(即。htaccess)重写过程重新开始,将/Subdomains/sub/foo输入传递给下一轮处理......
  3. 请求被重写为/Subdomains/sub/Subdomains/sub/foo.
  4. 重写过程重新开始......
  5. 请求被重写为/Subdomains/sub/Subdomains/sub/Subdomains/sub/foo.
  6. 重写过程重新开始......
  7. 等等,直到服务器放弃。(默认为 10 次内部重写后。)

L标志不会停止目录上下文中的所有处理(即。htaccess)。它只是停止当前轮的处理。重写过程继续进行,直到 URL 不变地通过。

Apache 2.4 的快速修复方法是简单地将L标志替换为END. 这会导致所有处理停止。不会发生进一步的通过重写引擎。

例如:

RewriteCond %{HTTP_HOST} ^(.*)\.example\.com
RewriteRule (.*) Subdomains/%1/$1 [END]

NCQSA标志在这里是多余的。

请注意,正则表达式^(.*)\.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 响应可能更可取。


推荐阅读